编译器可以忽略以下副本吗?
|
我仍然是新手程序员,我知道过早的优化是不好的,但是我也知道复制大量内容也是不好的。
我已经阅读了复制要素及其同义词,但例如在Wikipedia上的示例使我似乎只有在要返回的对象在完全构造的同时返回时,复制要素才能发生。
向量之类的对象呢?通常仅在填充某些东西并用作返回值时才有意义。
毕竟,空向量只能手动实例化。
那么,它在这种情况下是否也起作用?
简洁的坏风格:
vector<foo> bar(string baz)
{
vector<foo> out;
for (each letter in baz)
out.push_back(someTable[letter]);
return out;
}
int main()
{
vector<foo> oof = bar(\"Hello World\");
}
使用bar(vector&out,字符串文本)我没有真正的麻烦,但是上面的方法看起来更好,从美学上来说也有意图。
没有找到相关结果
已邀请:
3 个回复
郡豪靠暖
在这里,编译器需要完全构造两个不同的对象,并且只有稍后再决定要返回哪个对象,因此编译器必须复制一次,因为它无法直接在目标内存位置构造返回的对象。
缝皋
俯乡骚钵皆
的两个隐含副本都可以并且经常被删除。命名返回值优化可以消除返回语句
中隐含的副本,并且也可以消除eliminated4ѭ副本初始化中所隐含的。 在同时进行两种优化的情况下,
中构造的对象与
中的对象相同。 使用诸如此类的人工测试用例,可以更轻松地测试正在执行哪些优化。
复制构造函数已声明但未定义,因此无法内联和消除对其的调用。使用现在相对较旧的gcc 4.4进行编译,结果为
(过滤为C ++名称分解并进行编辑以删除非代码)。
可以看出,没有对复制构造函数的调用。实际上,即使在
,gcc也会执行这些优化。您必须提供ѭ11才能关闭此行为;如果执行此操作,则gcc将对
的副本构造函数生成两次调用-在对
的调用内部进行一次,在外部进行一次调用。