【发布时间】:2023-03-26 07:24:02
【问题描述】:
当 C++(隐式或显式)值构造函数需要在其对象中存储参数的副本时,是否应该通过值或引用到常量来接受其参数?
这是我能想到的最短的例子:
struct foo {
bar _b;
foo(bar [const&] b) // pass by value or reference-to-const?
: _b(b) { }
};
这里的想法是,我想在创建 foo 对象时,以任何可能创建 foo 对象的各种方式,最小化对 bar 的复制构造函数的调用。
请注意,我确实对复制省略和(命名)返回值优化有所了解,并且我已经阅读了"Want Speed? Pass by Value",但我认为这篇文章并没有直接解决这个用例。
编辑:我应该更具体。
假设我不知道sizeof(bar),或者bar 是否是基本的内置类型(bar 可能是模板参数,foo 可能是类模板一类)。另外,不要假设foo 的构造函数可以被内联(或者bar 的,就此而言)。请假设我至少可能正在使用实现 RVO 的编译器。
我希望有一种可能性(考虑到编译器优化)这样的调用不会调用任何对bar 的复制构造函数的调用(即使在foo 中执行_b(b) 时也是如此)初始化列表):
foo f = function_that_creates_and_returns_a_bar_object_using_rvo();
是否有可能(给定 C++98 标准)可以做到这一点,如果是这样,如果foo 通过引用到常量而不是通过价值?
【问题讨论】:
标签: c++ optimization constructor pass-by-reference pass-by-value