读书人

翻阅gcc libc的源代码wcslen函数的疑问

发布时间: 2013-07-04 11:45:40 作者: rapoo

阅读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 ..

[解决办法]
循环展开优化 啊

读书人网 >C语言

热点推荐