strlen()
誰かがGCCでの定義を教えてもらえますか? 私はリリース 4.4.2 を約 30 分間 grep してきましたが (Google は狂ったように)、strlen()
実際に実装されている場所を見つけることができないようです。
10 に答える
GCC ではなく、glibc で検索する必要があります。定義されているようです。glibc バージョン 2.7strlen.c
の strlen.c へのリンクを次に示します。また、strlen.c の glibc SVN リポジトリ オンラインへのリンクを次に示します。
gcc ではなくglibcを調べる必要がある理由は次のとおりです。
GNU C ライブラリは、 GNU システムおよび Linux カーネルを使用するほとんどのシステムで C ライブラリとして使用されます。
これがbsdの実装です
size_t
strlen(const char *str)
{
const char *s;
for (s = str; *s; ++s)
;
return (s - str);
}
元の投稿者はこれを知らなかったか、これを探していなかった可能性がありますが、gcc は内部的に、いくつかの mem*() 関数や ( gcc バージョン) strlen. そのような場合、ライブラリのバージョンは基本的に使用されることはなく、glibc のバージョンを指摘することは厳密には正しくありません。(これはパフォーマンス上の理由から行われます -- インライン化自体がもたらす改善に加えて、gcc は関数を提供するときに関数に関する特定のことを「認識」します。たとえば、strlen は純粋な関数であり、したがって、複数の呼び出しを最適化するか、またはエイリアシングが行われていない mem*() 関数の場合)。
詳細については、 http: //gcc.gnu.org/onlinedocs/gcc/Other-Builtins.htmlを参照してください。
これはあなたが探しているものですか?strlen() ソース. 詳細については、git リポジトリを参照してください。glibc リソース ページには、Web ビューを見るのではなく、それらを取得したい場合に git リポジトリへのリンクがあります。
Google Code Searchは、そのような質問の出発点として適しています。それらは通常、関数のさまざまな異なるソースと実装を指します。
あなたの特定のケースでは: GoogleCodeSearch(strlen)
Google Code Search は 2013 年 3 月に完全に閉鎖されました
これは古い質問だと思います。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);