是否可以指示编译器省略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 (...)
尽管我可以这样做,但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
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 返回类型 std::optional<std::variant<...>>
- 使用 boost::variant 并获取泛型返回类型
- 当 what() != T 时,我如何使 boost::variant 返回 T(),或者我如何检查 T==what()