C++ 是否可以指示编译器删除以C+;格式返回的变量的副本+;?
在我的数据库访问代码中,我希望编写一个方法:C++ 是否可以指示编译器删除以C+;格式返回的变量的副本+;?,c++,optimization,visual-studio-2012,copy,return,C++,Optimization,Visual Studio 2012,Copy,Return,在我的数据库访问代码中,我希望编写一个方法: variant_t GetQueryRows (...) 我想称之为: const variant_t result = GetQueryRows (...) 虽然我可以做到这一点,但在我的分析器结果中,变体的复制显示出相当高的精度。因此,我需要确保变体没有被复制。variant\u t中没有移动构造函数或移动赋值,我无法修改variant\u t的源以添加一个 在VisualStudio 2012中,我可以用C++来做什么,除了通过OUT参数返
variant_t GetQueryRows (...)
我想称之为:
const variant_t result = GetQueryRows (...)
虽然我可以做到这一点,但在我的分析器结果中,变体的复制显示出相当高的精度。因此,我需要确保变体没有被复制。variant\u t中没有移动构造函数或移动赋值,我无法修改variant\u t的源以添加一个
在VisualStudio 2012中,我可以用C++来做什么,除了通过OUT参数返回“结果”的明显的事情?
< P>编译器将通过优化调用来避免复制。如果可能的话,它们将由编译器应用,您不能强制它。此外,您还可以使用以避免深度复制不要让程序的逻辑依赖于这种优化。但是,要以某种方式编写代码,这样编译器才会被鼓励应用这些优化。编译器将通过一个名为的优化来避免复制这些优化。如果可能的话,它们将由编译器应用,您不能强制它。此外,您还可以使用以避免深度复制
不要让程序的逻辑依赖于这种优化。但是,请以某种方式编写代码,以鼓励编译器应用这些优化。如果
GetQueryRows
的结构是这样的,则可能会发生按返回值复制省略优化:
const variant_t GetQueryRows() {
variant_t result; // Exactly one declaration of return value
... // arbitrary code
return result; // Exactly one return statement.
}
参考:如果
GetQueryRows
的结构如下,则可能会发生按返回值复制省略优化:
const variant_t GetQueryRows() {
variant_t result; // Exactly one declaration of return value
... // arbitrary code
return result; // Exactly one return statement.
}
参考资料:您无法保证这一点。如果可能,编译器通常会通过删除此副本,但有几个注意事项 在
GetQueryRows
中,您应该只有一个从函数中的一个点返回的命名变量;多次返回,或可能返回一个或另一个值的返回,打破了返回值优化。您不能抛出任何异常
如果您想保证该行为,使用输出参数是唯一可靠的方法。您无法保证它。如果可能,编译器通常会通过删除此副本,但有几个注意事项 在
GetQueryRows
中,您应该只有一个从函数中的一个点返回的命名变量;多次返回,或可能返回一个或另一个值的返回,打破了返回值优化。您不能抛出任何异常
如果您想保证性能,使用输出参数是唯一可靠的方法。感谢大家提供的有用答案。听起来这里的关键是GetQueryRows调用抛出异常的ADO方法,因此这将防止省略。感谢大家提供的有用答案。听起来这里的关键是GetQueryRows调用抛出异常的ADO方法,因此这将防止省略。抛出异常可以防止MSVC执行复制省略,但原则上它不必这样做,也不必与G++或ClangThanks Brian&@Jonathan一起指出这些关于异常的细节。这是有用的信息。@Jonathanly你说得对,我只是指微软的指导方针,而不是编译器的一般指导方针。注意。抛出异常可以防止MSVC执行复制省略,但原则上它不必这样做,也不必与G++或ClangThanks Brian&@Jonathan一起指出这些关于异常的细节。这是有用的信息。@Jonathan你说得对,我只是指微软的指导方针,而不是编译器的一般指导方针。