什么是strlen elision?

3 c++ strlen c++17

我可以看到它被列为现代C++习语之一,但它到底是什么?

它只是一种复制省略吗?

Rak*_*111 7

你可能知道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调用.

  • 通过"完整程序优化"(由Microsoft的链接器执行),很多事情都是可能的.例如,如果将一个字符串文字传递给一个函数,该函数又调用strlen,并且该函数被链接器内联,则对strlen的调用变为elidable.如果链接器和编译器一样聪明,那就是. (2认同)