当我有以下代码时
int main(void) {
printf("%zd\n", strlen("Hello World!"));
return 0;
}
并编译它-O3
, strings
将显示字符串“Hello World!”二进制文件中缺少它,因为它是在编译时评估的。
如果我改用我自己的函数
static inline size_t my_strlen(const char *s) {
const char *tmp = s;
while (*++tmp);
return tmp - s;
}
int main(void) {
printf("%zd\n", my_strlen("Hello World!"));
return 0;
}
使用相同的选项,仍然可以在二进制文件中找到该字符串。
为什么是这样?
因为它是一个优化 http://en.wikipedia.org/wiki/Optimizing_compiler标准允许的。
在某些系统上,strlen
最终扩展为_builtin_strlen
GCC 编译器知道这一点。在我的机器上/usr/include/x86_64-linux-gnu/bits/string.h
(这是间接地包含于<string.h>
) has
# define strlen(str) \
(__extension__ (__builtin_constant_p (str) \
? __builtin_strlen (str) \
: __strlen_g (str)))
那么实际上它是由 GNU 混合完成的glibc
and gcc
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)