相关疑难解决方法(0)

为什么emplace_back("Hello")调用strlen?

贾斯汀对另一个问题的回答使得我觉得非常有趣,但无法解释.请考虑以下代码:

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_backstrlen这里优化呼叫?我最初的想法是在函数调用之前push_back隐式创建(因此构造函数直接传递字符串文字,这是最佳处理),而在函数调用之后创建(因此构造函数转发字符串文字,我推测已经从a衰减到a ,因此需要打电话).std::string std::stringemplace_backstd::string std::stringconst char [N]const char *strlen

但是emplace_back需要一个T&&参数,和我的测试显示,字符串文字不应该在这里腐烂的指针.显然,我忽略了一些东西.

c++ stdstring stdvector

8
推荐指数
1
解决办法
266
查看次数

标签 统计

c++ ×1

stdstring ×1

stdvector ×1