C++ RVO:什么时候发生?
C++ RVO: when it happens?
http://coliru.stacked-crooked.com/a/c795a5d2bb91ae32
#include <iostream>
struct X {
X(const char *) { std::cout << 1; }
X(const X &) { std::cout << 2; }
X(X &&) { std::cout << 3; }
};
X f(X a) {
return a;
}
X g(const char * b) {
X c(b);
return c;
}
int main() {
f("hello"); // 13
g("hello"); // 1
}
最后一行函数有什么不同吗f(X a)
:
return a;
而不是 return std::move(a);
?
函数 f
没有 RVO 但 g
有 NRVO 是真的吗?
Is there any difference in the last line of function f(X a): return a; instead of return std::move(a);?
没有。 a
是函数的局部变量,所以 return a
可以从它移动。
Is it true that function f
doesn't have RVO but g
has NRVO?
正确。命名省略从不应用于函数参数;它仅适用于不是函数参数的局部变量。
http://coliru.stacked-crooked.com/a/c795a5d2bb91ae32
#include <iostream>
struct X {
X(const char *) { std::cout << 1; }
X(const X &) { std::cout << 2; }
X(X &&) { std::cout << 3; }
};
X f(X a) {
return a;
}
X g(const char * b) {
X c(b);
return c;
}
int main() {
f("hello"); // 13
g("hello"); // 1
}
最后一行函数有什么不同吗f(X a)
:
return a;
而不是 return std::move(a);
?
函数 f
没有 RVO 但 g
有 NRVO 是真的吗?
Is there any difference in the last line of function f(X a): return a; instead of return std::move(a);?
没有。 a
是函数的局部变量,所以 return a
可以从它移动。
Is it true that function
f
doesn't have RVO butg
has NRVO?
正确。命名省略从不应用于函数参数;它仅适用于不是函数参数的局部变量。