你可能知道std::strlen在整个字符串上循环.在某些情况下,这可能效率低下,因为这意味着CPU必须开始计算字符数,这会减少其他内容的缓存局部性.
但在大多数情况下,编译器能够优化std::strlen和计算字符串本身的字符数,而不是让生成的程序执行它.这有时被称为strlen elision(因为它省略了对strlen的调用).
一个简单的例子就std::strlen可以完全优化.
#include <cstring>
int main() {
return std::strlen("hi");
}
Run Code Online (Sandbox Code Playgroud)
在-O3最终的组装下
main: # @main
mov eax, 2
ret
Run Code Online (Sandbox Code Playgroud)
即使在-O0没有循环生成!
现在这是一个相当简单的例子,但它甚至可以用于更复杂的用法std::strlen.
#include <cstring>
int main(int argc, char**) {
const char *string;
if (argc == 1)
string = "hello";
else if (argc == 2)
string = "world";
else if (argc == 3)
string = "!";
return std::strlen(string);
}
Run Code Online (Sandbox Code Playgroud)
这里的字符串完全被优化,以及std::strlen调用.
| 归档时间: |
|
| 查看次数: |
304 次 |
| 最近记录: |