【发布时间】:2014-05-11 17:26:53
【问题描述】:
在成员函数中,我想返回一个新创建的字符串向量。
从内存分配和构造函数调用的角度来看,哪个版本最有效? theString(i) 返回一个 const std::string &
std::vector<std::string> result(depth());
for(int i=0;i<depth;i++) {
result[i] = theString(i);
}
或
std::vector<std::string> result;
result.reserve(depth());
for(int i=0;i<depth;i++) {
result.emplace_back(theString(i));
}
在我看来:
- 解决方案 1 首先构造每个空字符串,然后复制分配它们 => 不完美
- 解决方案 2 更好,因为它将复制构造每个字符串,而矢量数据由
reserve分配一次
(或者有没有更有效的解决方案?)
【问题讨论】:
-
哪个代码 sn-p 更容易维护,或者在寻找错误时忽略,等等
-
我想您的编译器会将两者优化为相同的代码,检查两者的程序集输出,看看是否有任何差异。正如 Alf 提到的,可读性远比这些微优化更重要。所以选择最容易阅读和维护的东西。
-
嗯,可读性没有太大区别,绝对是在速度临界区。
-
The Rules of Optimization Club 应用第二条规则。
-
@shuttle87:实际上,这不太可能。但它是否会影响速度是另一个问题。