21得票1回答
避免返回 const 局部变量?

我一直认为将局部常量定义为const是很好的做法void f() { const resource_ptr p = get(); // ... } 然而,上周我观察到一些学生在完成C++练习时想知道一个const指针被返回的含义。resource_ptr f() { c...

16得票1回答
使用std::optional时的命名返回值优化

我最近发现了std::optional作为提高代码清晰度的一种方法,特别是对于函数的返回值。然而,我对它对性能的影响有疑问。更具体地说,我想知道是否可能编写类似下面这样的代码,使编译器能够应用命名返回值优化。struct Data { int x; int y; }; std...

12得票1回答
C++编译器能否对const返回值执行RVO优化?

假设我有以下函数: #include <string> std::string const foo() { std::string s = "bar"; return s; } int main() { std::string t = foo(); }...

11得票1回答
编译器是否足够聪明,能std::move超出作用域的变量?

考虑以下代码:std::vector<int> Foo() { std::vector<int> v = Bar(); return v; } return v 是 O(1) 的,因为 NRVO 将省略复制,直接在函数返回值将要移动或复制的存储空间中构造...

11得票1回答
不应该保证 NRVO 使得本地命名变量和调用点变量具有相同的地址吗?

我认为应该这样做,因为这对于正确性很重要。但是,我对Clang的输出感到惊讶。请考虑下面的代码:#include <iostream> struct S { int i; S(int i) : i(i) {} S(S&&) { ...

9得票1回答
C++ ABI如何处理RVO和NRVO?

我对编译器和链接器如何处理函数调用者的要求因函数使用RVO或NRVO而不同感到困惑。 也许这是我的误解,但我的假设是通常情况下没有RVO或NRVO, std::string s = get_string(); 涉及将s从get_string的结果中移动构造,如果get_string不执...

9得票4回答
当返回std::pair时,是否会发生RVO?

一个函数需要向调用者返回两个值,最好的实现方式是什么? 选项1: pair<U,V> myfunc() { ... return make_pair(getU(),getV()); } pair<U,V> mypair = myfunc(); 选项 1.1: ...

8得票2回答
为什么clang没有使用NRVO进行优化?

我正在思考一个相当不错的C++11编译器(clang)为何不能优化这段代码,并想知道这里是否有人有意见。 #include <iostream> #define SLOW struct A { A() {} ~A() { std::cout << "A d'...

8得票2回答
为什么这里没有使用NRVO优化?

在我在VS2010中运行此代码时,NRVO未被应用。 #include <stdio.h> class A { public: A() { printf( "I am in constructor\n" ); } A(const A& a) {...

7得票3回答
C++中带括号的返回语句中的nrvo/copy elision

我正在研究以下代码,并使用我的Visual Studio 2017应用程序和两个不同的在线编译器得到了不同的结果。在发布模式下,Visual Studio在两种情况下都会省略复制/移动操作,而两个在线编译器只会在未加括号的返回语句中省略。我的问题是:谁是正确的,更重要的是,底层规则是什么。(我...