字符串字面量的strlen是否会被优化?编译时还是运行时计算长度?
字符串字面量的
strlen是否会被编译期优化? 嘿,这个问题问得相当精准!答案是绝大多数现代编译器都会把针对字符串字面量的strlen调用直接优化成编译期常量——也就是说你代码里strlen(foo)得到的11,会在编译阶段就直接注入到程序中,完全不会在运行时去计算字符串长度。
具体来说:
- 核心原因在于字符串字面量是编译期就能确定的常量,编译器可以在编译时直接统计它的有效字符数(自动忽略末尾的
\0终止符)。你写的"lorem ipsum"刚好是11个可见字符,所以strlen的结果是确定的11。 - 拿你的代码举例:
只要编译器开启了基础优化(比如GCC的const auto foo = "lorem ipsum"; auto len = strlen(foo);-O1及以上,Clang或MSVC的对应优化级别),编译后len会直接被赋值为11,就跟你手动写auto len = 11;完全一样,不会有任何运行时调用strlen的开销。 - 当然也有极端例外:如果你强制关闭所有优化(比如GCC用
-O0),编译器可能会保留运行时的strlen调用,但这种场景一般只用于调试,生产环境没人会这么做。另外如果字符串是通过间接方式传递的(比如作为函数参数的const char*,编译器无法确定它指向的是字面量),那优化就没法进行,但你这里是直接绑定到字面量的变量,完全符合优化条件。
要是你想验证的话,可以查看编译器生成的汇编代码——比如给GCC加-S参数,你会发现里面根本没有strlen的调用指令,直接是把常量11赋值给了len变量。
内容的提问来源于stack exchange,提问作者Jonathan Mee
相关产品推荐
相关产品推荐

