![]() |
1
30
你应该看glibc,而不是gcc——它似乎是在
你应该关注的原因 glibc 而不是GCC是:
|
![]() |
2
10
我知道这个问题已经存在4年了,但GCC通常会将其
拥有
如果没有,请复制strlen
GCC将内联它的副本,它在x86上是repnz scasb asm变体,除非您传递-werror或-fno builtin。与此相关的文件位于
它还由gcc/builtins.c.控制。如果您想知道strlen()是否以及如何优化为常量,请参见定义为
|
![]() |
3
7
这里是 bsd 实施
|
![]() |
4
3
这就是你要找的吗? strlen() source . 见 git repository 更多信息。这个 glibc resources page 如果您想获取Git存储库的链接,而不是查看Web视图,则可以使用这些链接。 |
![]() |
5
3
尽管最初的海报可能不知道这一点,或者一直在寻找这一点,但GCC内部会引入许多它自己定义的所谓“内置”C函数,包括一些mem*()函数和(取决于GCC版本)strlen。在这种情况下,库版本基本上从未被使用过,并且在glibc中指出这个版本的人严格来说是不正确的。(它这样做是出于性能原因——除了内联本身所产生的改进之外,GCC在提供函数时“知道”一些关于函数的事情,例如,strlen是一个纯函数,因此它可以优化多个调用,或者在mem*()函数没有发生别名的情况下。) 有关详细信息,请参阅 http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html |
![]() |
6
3
谷歌代码搜索于2013年3月完全关闭 |
![]() |
7
3
定义在 glibc/string/strlen.c
|
![]() |
8
1
我知道这是个老问题,你可以在Github上找到Linux内核源代码。 here 和32位的strlen()实现可以在 strlen_32.c 在吉瑟布上。上述文件具有此实现。
|
![]() |
9
0
你可以用这个代码,越简单越好!
|
![]() |
10
0
glibc 2.26有几个手工优化的装配实现
至于
在glibc树中,显示了许多针对所有主要架构和变体的手工装配优化实现。 特别是,仅x86_64有三种变体:
确定使用哪一种测试程序的一种快速而肮脏的方法是逐步调试测试程序:
编译时使用:
蝙蝠:
包含:
因此正在调用libc版本。
几分钟后
这告诉我
然后,我进一步确认:
并与glibc源代码进行了比较。 使用avx2版本并不奇怪,因为我有一个 i7-7820HQ CPU,上市日期为2017年第1季度,支持AVX2,以及 AVX2 是最先进的组件实现,发布日期为2013年第2季度,而 SSE2 从2004年开始更古老。 这就是glibc的核心核心部分的来源:它有很多优化的手工编写的汇编代码。 在Ubuntu 17.10、GCC 7.2.0、Glibc 2.26中测试。
托多:与
是因为它可以更好地优化吗?但它的输出不包含AVX2指令,所以我觉得情况并非如此。 https://www.gnu.org/software/gcc/projects/optimize.html 提到:
我的简单测试表明
|