在我的数据库访问代码中,我希望编写一个方法:
variant_t GetQueryRows (...)
我想称之为:
const variant_t result = GetQueryRows (...)
虽然我可以这样做,但是我的探查器结果中对variant_t的复制显示得相当高。所以我需要确保不复制variant_t。 variant_t中没有移动构造函数或移动赋值,我无法修改variant_t的来源以添加一个。
除了通过out参数返回'result'这一显而易见的事情外,我在使用C ++的Visual Studio 2012中能做些什么吗?
答案 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