[英]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.