25

strlen()誰かがGCCでの定義を教えてもらえますか? 私はリリース 4.4.2 を約 30 分間 grep してきましたが (Google は狂ったように)、strlen()実際に実装されている場所を見つけることができないようです。

4

10 に答える 10

33

GCC ではなく、glibc で検索する必要があります。定義されているようです。glibc バージョン 2.7strlen.cの strlen.c へのリンクを次に示します。また、strlen.c の glibc SVN リポジトリ オンラインへのリンクを次に示します。

gcc ではなくglibcを調べる必要がある理由は次のとおりです。

GNU C ライブラリは GNU システムおよび Linux カーネルを使用するほとんどのシステムで C ライブラリとして使用されます。

于 2009-11-14T04:36:26.540 に答える
13

これがbsdの実装です

size_t
strlen(const char *str)
{
        const char *s;

        for (s = str; *s; ++s)
                ;
        return (s - str);
}
于 2009-11-14T04:40:10.357 に答える
4

元の投稿者はこれを知らなかったか、これを探していなかった可能性がありますが、gcc は内部的に、いくつかの mem*() 関数や ( gcc バージョン) strlen. そのような場合、ライブラリのバージョンは基本的に使用されることはなく、glibc のバージョンを指摘することは厳密には正しくありません。(これはパフォーマンス上の理由から行われます -- インライン化自体がもたらす改善に加えて、gcc は関数を提供するときに関数に関する特定のことを「認識」します。たとえば、strlen は純粋な関数であり、したがって、複数の呼び出しを最適化するか、またはエイリアシングが行われていない mem*() 関数の場合)。

詳細については、 http: //gcc.gnu.org/onlinedocs/gcc/Other-Builtins.htmlを参照してください。

于 2012-02-18T03:05:11.737 に答える
3

これはあなたが探しているものですか?strlen() ソース. 詳細については、git リポジトリを参照してください。glibc リソース ページには、Web ビューを見るのではなく、それらを取得したい場合に git リポジトリへのリンクがあります。

于 2009-11-14T04:39:55.563 に答える
3

Google Code Searchは、そのような質問の出発点として適しています。それらは通常、関数のさまざまな異なるソースと実装を指します。

あなたの特定のケースでは: GoogleCodeSearch(strlen)

Google Code Search は 2013 年 3 月に完全に閉鎖されました

于 2009-11-14T04:50:13.533 に答える
-1

これは古い質問だと思います。Linux カーネル ソースは github hereにあります。また、strlen() の 32 ビット実装は github のstrlen_32.cにあります。上記のファイルにはこの実装があります。

#include <linux/types.h>
#include <linux/string.h>
#include <linux/module.h>

size_t strlen(const char *s)
{
    /* Get an aligned pointer. */
    const uintptr_t s_int = (uintptr_t) s;
    const uint32_t *p = (const uint32_t *)(s_int & -4);

    /* Read the first word, but force bytes before the string to be nonzero.
     * This expression works because we know shift counts are taken mod 32.
     */
    uint32_t v = *p | ((1 << (s_int << 3)) - 1);

    uint32_t bits;
    while ((bits = __insn_seqb(v, 0)) == 0)
        v = *++p;

    return ((const char *)p) + (__insn_ctz(bits) >> 3) - s;
}
EXPORT_SYMBOL(strlen);
于 2016-09-28T08:05:11.620 に答える