gpt4 book ai didi

c++ - 为什么编译器不能优化 std::string concat?

转载 作者:可可西里 更新时间:2023-11-01 17:50:32 25 4
gpt4 key购买 nike

我尝试这样简单的代码:

#include <cstdio>
#include <string>

int main()
{
const std::string s = std::string("a") + "b";
puts(s.c_str());
return 0;
}

我希望编译器(gcc 4.8.2/clang 3.5.0)优化这样的代码

 int main()
{
puts("ab");
return 0;
}

但我得不到这样的结果,我尝试了不同的选项,如“-Ofast”、“-flto”、“-static-libstdc++”,但总是在反汇编输出中看到三个函数调用:

...
callq 0x4017e0 <_ZNSsC2EPKcRKSaIcE>
...
callq 0x401690 <_ZNSs6appendEPKc>
...
callq 0x401490 <_ZNSs4_Rep10_M_disposeERKSaIcE>

第一个是调用 std::basic_string, std::allocator >::basic_string(char const*, std::allocator const&)。

周围的任何编译器都可以将此类代码优化为 puts("ab");或者至少到“std::string s("ab");"?

如果没有这样的编译器,是什么让这种优化难以实现?

更新关于现实世界的使用。我在真实代码中看到/看到很多地方都有这样的模式:

  std::string s = std::string(string_const1) + string_const2 + string_variable + string_const3;

如果性能很重要,当然可以重写这样的代码以更优化的方式。

但是现代编译器在优化代码方面做得很好。和 gcc,例如,具有用于 malloc/free/strcpy/strcat 等的 __builtin 函数。如果来自 gcc 的 libstdc++ 的 std::basic_string 使用它们这个函数(malloc、free、strcpy、strcat)作为部分实现,为什么不预测函数使用的结果并给出答案。

最佳答案

std::string 涉及存储的动态分配,在大多数情况下,实现极其复杂,因此不能简化为编译时语义,无论编译器的常量折叠有多好归结为一门艺术。

但是:如果您的 string 实际上是这样声明的,为什么您不首先使用 char 数组而是选择 string ?如果您需要使用一些字符串来生成其他字符串,仍然有一些工具可以使用 char 数组来完成这项工作,特别是自从 C++11 引入了可变参数模板和 constexpr . C++ 的 future 版本也有望引入 std::string_literal以进一步缓解这种情况。

关于c++ - 为什么编译器不能优化 std::string concat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26725847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com