翻阅gcc libc的源代码wcslen函数的疑问
阅读gcc libc的源代码wcslen函数的疑问本帖最后由 JohnPhan 于 2013-04-26 16:27:55 编辑为什么连续用了3
阅读gcc libc的源代码wcslen函数的疑问
本帖最后由 JohnPhan 于 2013-04-26 16:27:55 编辑 为什么连续用了3个同样的if语句?真是不解。
源代码如下:
size_t
wcslen (s)
const wchar_t *s;
{
size_t len = 0;
while (s[len] != L'\0')
{
if (s[++len] == L'\0')
return len;
if (s[++len] == L'\0')
return len;
if (s[++len] == L'\0')
return len;
++len;
}
return len;
}
版本信息:
glibc 2.0 wcslen GCC C
[解决办法]这个应该是对CPU指令执行的优化吧,并行处理,如果每次都进入while就不会进行并行运算了。
[解决办法]不准确的猜想:可能是为了优化代码执行效率,c循环汇编之后,由于编译器的缘故,大多效率并不高,减少循环复杂度是提高效率的一个可行的方法
[解决办法]我看了下 x86 , x64 , arm , ppc 下的目标代码, 这样写与平凡的写法生成的目标代码基本没有啥区别 (-O3 -fomit-frame-pointer) , 看来gcc的优化还没有足够强大, 也许只是写的人习惯了看到循环就做循环展开优化, 反正也不会变的更坏, 本来我期望 arm 下能生成类似的指令的 ...
ldr ..
cmp ..
beq ..
ldrne ..
cmpne ..
beq ..
[解决办法]循环展开优化 啊