任何人都可以指向我在GCC中定义的strlen()
吗?我一直在抱怨释放4.4.2现在大约半小时(虽然Google疯狂),我似乎无法找到strlen()
实际上在哪里实施。strlen()在gcc中的实现
回答
你应该看glibc,而不是GCC - 它似乎被定义在strlen.c
- 这是一个链接到strlen.c for glibc version 2.7 ...这里是一个链接到glibc SVN repository online for strlen.c。
你应该看glibc,而不是海湾合作委员会的原因是:
GNU C库作为在GNU系统 C库和最系统的Linux内核。
这是你在找什么? strlen() source。有关更多信息,请参阅git repository。 glibc resources page有链接到git仓库,如果你想抓住他们而不是看web视图。
这里的bsd实施
size_t
strlen(const char *str)
{
const char *s;
for (s = str; *s; ++s)
;
return (s - str);
}
仍然在等待编译器从此产生可用快速机器代码的日子......目前它还不到优化的* C *版本速度的一半。 – 2011-02-24 04:38:36
Google Code Search是这样的问题一个很好的起点。它们通常指向函数的各种不同的来源和实现。
你的具体情况:
GoogleCodeSearch(strlen)
谷歌代码搜索完全在2013年3月关闭
虽然原来的海报可能不知道这还是一直在找这个,海合会内部内联一它自己定义的所谓“内建”c函数的数量,包括一些mem *()函数和(取决于gcc版本)strlen。在这种情况下,库的版本基本上不会被使用,并且将人指向glibc中的版本并不严格地讲是正确的。 (这是出于性能方面的考虑 - 除了内联本身产生的改进之外,gcc在提供函数时会“知道”某些函数,例如,strlen是一个纯函数,因此它可以优化掉多个电话,或在MEM *()不走样正在发生作用。)
有关的更多信息的情况下,看到http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
我意识到这个问题是4岁,但GCC通常会包括自己的 strlen的副本,如果您没有#include <string.h>
并且没有答案(包括接受的答案)对此作出说明。如果你忘了,你会得到一个警告:
file_name:line_number: warning: incompatible implicit declaration of built-in function 'strlen'
和gcc将它内联副本在x86上运行的REPNZ SCASB ASM变种,除非你通过-Werror或-fno-内置。与此相关的文件在gcc/config/<platform>/<platform>.{c,md}
它也由gcc/builtins.c控制。如果您想知道是否以及如何将strlen()优化为常量,请参阅此文件中定义为tree c_strlen(tree src, int only_value)
的函数。它也控制如何扩展和折叠(基于前面提到的配置/平台)(基于前面提到的配置/平台)
我意识到这是一个老问题,你可以在github上找到linux内核源码here,以及32位strlen()的实现可以在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);
您可以使用此代码,越简单越好!
size_t Strlen (const char * _str)
{
size_t i = 0;
while(_str[i++]);
return i;
}
- 1. 在strlen实现中了解代码
- 2. 在gcc中实现__sync_swap()
- 3. 在新的gcc中未实现,但在旧的实现?
- 4. std :: put_time在GCC中的实现状态?
- 5. 在GCC实现位字段
- 6. strlen实际在做什么?
- 7. 我怎么能实现GCC
- 8. GCC原子shared_ptr实现
- 9. 什么是string ++在for循环中在C++中实现strlen时在此处
- 10. std :: vector的概念和GCC实现
- 11. 在GCC中实现的精确宽度整数类型如何?
- 12. C++的strlen(CH)和sizeof(CH)strlen的
- 13. -mx32 GCC标志是否实现(正确)?
- 14. 使用gcc实现自动矢量化?
- 15. strlen在程序集中
- 16. 在arm7中使用gcc实现malloc问题:malloc返回NULL
- 17. 如何在gcc中实现可变参数?
- 18. std :: C++的gcc实验性实现的未来异常0x
- 19. strlen(string)和strlen(* string)之间的区别
- 20. GCC编译错误:声明'strlen'必须可用
- 21. Strlen到结构中
- 22. c中的strlen函数
- 23. strlen的EXC_BAD_ACCESS在Xcode - ç
- 24. 如何强制gcc使用newlibc实现函数的自定义实现?
- 25. PickerView在Titanium中实现的TableView实现
- 26. 在python中实现R表的实现
- 27. 我在哪里可以找到GCC源代码中的strncpy()函数的实现?
- 28. 如何在基于Linux GCC的汇编语言中实现__sync_fetch_and_sub原子操作GCC
- 29. 哪个线程库在linux上使用gcc来实现OpenMP?
- 30. 在gcc和VS中strstr()的实现是否具有线性复杂性?
我甚至有glibc,并没有想到看起来。很漂亮。感谢您的高举。 – 2009-11-14 04:51:25
梅,这不是很优化。至少在Visual C++中,我们得到了一个体面的汇编语言strlen。 – toto 2009-11-14 04:55:20
“GNU C库主要是为便携式和高性能C库设计的。”我猜他们可能会把更多的重量放在可移植性部分。 – 2009-11-14 05:00:30