6

在分析 C++ 应用程序时,我注意到以下代码:

std::string s;
int i;

dict[s[i]] ++; 

产生 (inline) 的调用std::string::_M_leak_hard,链接到std::string::_M_mutate和更多(gcc-4.7.3),并通过疯狂数量的 CPU 指令比较字符串的内部状态,在应该是 const 上下文并优化为一个简单的内存读取。

我做错了什么吗?这条 std::string 实现特定细节链很容易消耗 50% 的 CPU 时间。

4

1 回答 1

6

您正在查看的代码确实是gcc 实现中的取消共享std::string。至于为什么编译器为此 LHS 选择可变路径,答案很简单:这就是重载解析的方式。通过检查参数和调用该运算符的对象来选择要使用的运算符。在这种情况下,对象是非常量的,因此会拾取非常量重载。

您可以尝试通过对代码进行最小更改来强制获取 const 重载:

std::string s = ..;
int i = ..;

const std::string& r = s;
++dict[r[i]];

主要变化是创建对对象的 const 引用以强制使用 const 重载operator[]

于 2013-11-12T02:59:54.180 回答