贾斯汀对另一个问题的回答使得我觉得非常有趣,但无法解释.请考虑以下代码:
std::vector<std::string> v;
v.push_back("Hello, world!"); // Doesn't call strlen.
v.emplace_back("Hello, world!"); // Calls strlen.
Run Code Online (Sandbox Code Playgroud)
如果查看程序集,则emplace_back生成一个调用strlen,而push_back不是(在gcc 8.1和clang 6.0中使用测试-Ofast).
为什么会这样?为什么不能emplace_back在strlen这里优化呼叫?我最初的想法是在函数调用之前push_back隐式创建(因此构造函数直接传递字符串文字,这是最佳处理),而在函数调用之后创建(因此构造函数转发字符串文字,我推测已经从a衰减到a ,因此需要打电话).std::string std::stringemplace_backstd::string std::stringconst char [N]const char *strlen
但是emplace_back需要一个T&&参数,和我的测试显示,字符串文字不应该在这里腐烂的指针.显然,我忽略了一些东西.