题
我的功能看起来像这样:
// Fetch 1 MB of data
void GetData(std::vector<char> & outData);
1MB被夸大了,但我只想指出,最好避免不必要的副本。
如果我添加此过载:
std::vector<char> GetData()
{
std::vector<char> result;
GetData(result);
return result;
}
那么RVO启动的可能性有多大?
解决方案
对于最新的编译器(例如,VS 2005或更新的GCC 3.4或更新),这是可以肯定的。我只说“最多”,因为我还没有测试存在的每个编译器。我可能在过去5年左右查看的每个新编译器都包含了它。
其他提示
RVO很可能会启动,因为这是一个非常简单的优化,已经有一段时间了。但是,为了在中等高性能的代码中给出此代码实际实用值,您需要NRVO。 NRVO很难遇到,因为它是相对较新的。但是它可用。一个例如,自VS2005以来,MS编译器实现了它。
我认为这没有任何标准答案:这取决于您的编译器及其能力。
如果您想为方便起见而实施此功能,为什么不尝试使用编译器,然后查看组件或配置文件并查看会发生什么呢?关于您的编译器实际做的经验证据可能比猜测某些编译器可能会或不做什么更好。
那么RVO启动的可能性有多大?
思考而不是编译器是软件开发人员的工作。
通常对编译器进行优化,以使良好的代码运行良好 - 不是不好的代码。
就个人而言,我使用第一个表格。通常使用指针而不是引用 - 强调参数是输出的事实,而不是输入。
另外,请注意,当您说:
std::vector<char> GetData()
{
// :
return result;
}
vector<char> x = GetData();
在卡利, result
被复制到“返回值”,然后在呼叫者中,将“返回值”复制到 x
. 。 NRVO可以摆脱其中一份,但不能两者兼而有之。编译器必须至少一次调用Copy CTOR一次,因为它必须假定COPY CTOR具有必须完成的副作用。
不隶属于 StackOverflow