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

时间:2013-11-15 15:04:02

标签: c++ optimization visual-studio-2012 copy return

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

variant_t GetQueryRows (...)

我想称之为:

const variant_t result = GetQueryRows (...)

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

除了通过out参数返回'result'这一显而易见的事情外,我在使用C ++的Visual Studio 2012中能做些什么吗?

3 个答案:

答案 0 :(得分:4)

你无能为力保证它。如果可能,编译器通常会通过return value optimization忽略此副本,但有几点需要注意。

GetQueryRows内,您应该只从函数中的一个点返回一个命名变量;多个返回或可能返回一个值或另一个值的返回,中断返回值优化。你不能抛出任何例外。

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

答案 1 :(得分:2)

编译器将通过名为return value optimization的优化来避免复制。它们将由编译器应用,如果可能的话,你不能强制它。此外,您可以使用move semantics来避免深层复制。

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

答案 2 :(得分:1)

如果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