繁体   English   中英

是否可以指示编译器删除C ++中返回的variant_t的副本?

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

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

variant_t GetQueryRows (...)

我想称之为:

const variant_t result = GetQueryRows (...)

尽管我可以做到,但对profile_t的复制在我的探查器结果中显示出很高的水平。 因此,我需要确保variant_t不被复制。 在variant_t中没有移动构造函数或移动分配,并且我无法修改variant_t的源以添加一个。

除了通过out参数返回“结果”这一显而易见的事情,我还能在Visual Studio 2012中使用C ++做任何事情吗?

您无法做任何保证。 如果可能的话,编译器通常会通过返回值优化来消除此副本,但有一些警告。

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/zh-cn/library/ms364057(v=vs.80).aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM