作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我的 SAX xml 解析回调(XCode 4、LLVM)中,我做了很多调用这种类型的代码:
static const char* kFoo = "Bar";
void SaxCallBack(char* sax_string,.....)
{
if ( strcmp(sax_string, kFoo, strlen(kFoo) ) == 0)
{
}
}
是否可以安全地假设 strlen(kFoo) 已被编译器优化?
(苹果示例代码已经预先计算了 strlen(kFoo),但我认为这对于大量常量字符串来说容易出错。)
编辑:优化动机:使用 NSXMLParser 在 iPod touch 2G 上解析我的 SVG map 需要 5 秒(!)。所以,我想切换到 lib2xml,并优化字符串比较。
最佳答案
如果“LLVM”是指 clang,那么是的,您可以依靠 clang -O
来优化 strlen
。以下是您的函数的代码:
_SaxCallBack:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
leaq L_.str1(%rip), %rsi
movl $3, %edx
callq _strncmp
...
我把strcmp
改成了strncmp
,但是第三个参数确实被直接的$3
代替了。
请注意,gcc 4.2.1 -O3 并未优化此 strlen
调用,您只能期望它在您问题的精确条件下工作(尤其是字符串和对strlen
必须在同一个文件中)。
关于我可以指望我的编译器在 const char * 上优化 strlen 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5770709/
我正在获取一个静态文件。多次获取同一个文件而不是将其保存在局部变量中有什么缺点(如果有的话)? function getInfo(){ fetch(src); } getInfo(); get
我是一名优秀的程序员,十分优秀!