是否可以指示编译器省略C++中返回的variant_t的副本

Can a compiler be instructed to elide away the copy of variant_t being returned in C++?

本文关键字:返回 variant 副本 C++ 指示 编译器省 是否      更新时间:2023-10-16

在我的数据库中访问代码,我希望编写一个方法:

variant_t GetQueryRows (...)

我想称之为:

const variant_t result = GetQueryRows (...)

尽管我可以这样做,但variant_t的复制在我的探查器结果中显示相当高。 所以我需要确保不复制variant_t。 variant_t 中没有移动构造函数或移动赋值,我无法修改variant_t源以添加一个。

除了通过 out 参数返回"结果"的明显事情之外,我可以使用 C++ 在 Visual Studio 2012 中做些什么吗?

你无法保证这一点。如果可能,编译器通常会通过返回值优化来消除此副本,但有几个注意事项。

GetQueryRows 中,您应该只有一个命名变量从函数中的一个点返回;多个返回或可能返回一个值或另一个值的返回会破坏返回值优化。不能引发任何异常。

如果要保证行为,使用输出参数是唯一可靠的方法。

编译器将通过称为返回值优化的优化来避免复制它。如果可能的话,编译器将应用它们,你不能强制它。此外,还可以使用移动语义来避免深度复制。

不要让程序的逻辑依赖于这种优化。但是,请以某种方式编写代码,以便鼓励编译器应用这些优化。

如果GetQueryRows结构如下,则可能会发生返回值优化的复制省略:

const variant_t GetQueryRows() {
    variant_t result;  // Exactly one declaration of return value
    ...                // arbitrary code
    return result;     // Exactly one return statement.
}

参考: http://msdn.microsoft.com/en-us/library/ms364057(v=vs.80).aspx