繁体   English   中英

为什么emplace_back(“Hello”)调用strlen?

[英]Why does emplace_back(“Hello”) call strlen?

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

std::vector<std::string> v;
v.push_back("Hello, world!");  // Doesn't call strlen.
v.emplace_back("Hello, world!");  // Calls strlen.

如果查看程序集, emplace_back生成对strlen的调用 ,而push_back则不会 (使用-Ofast在gcc 8.1和clang 6.0中-Ofast )。

为什么会这样? 为什么emplace_back不能在这里优化strlen调用? 我最初的想法是push_back在函数调用之前隐式创建std::string (因此std::string构造函数直接传递字符串文字,这是最佳处理),而emplace_back在函数之后创建std::string call(所以std::string构造函数转发了字符串文字,我认为它已经从const char [N]衰减到const char * ,因此需要strlen调用)。

但是emplace_back接受了一个T&&参数我的测试显示字符串文字不应该在这里衰减为指针 显然,我忽略了一些东西。

strlen调用是在慢速路径的外部函数体中; 该函数体必须对const char (&)[42]类型的所有参数都有效(在你的godbolt示例中),包括不是源自41个字符且没有嵌入空值的字符串文字的参数。

快速路径内联到foo ,它确实在编译时计算长度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM