Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以指示编译器删除以C+;格式返回的变量的副本+;?_C++_Optimization_Visual Studio 2012_Copy_Return - Fatal编程技术网

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你说得对,我只是指微软的指导方针,而不是编译器的一般指导方针。