A*******e 发帖数: 2419 | 1 第二个函数里的std::move()是不是画蛇添足?
vector foo() {
vector x;
for (int i = 0; i < 10; ++i) {
x.push_back(i);
}
return x;
}
vs
vector foo() {
vector x;
for (int i = 0; i < 10; ++i) {
x.push_back(i);
}
return std::move(x);
} |
x****u 发帖数: 44466 | 2 这可是C++11的重点特性
【在 A*******e 的大作中提到】 : 第二个函数里的std::move()是不是画蛇添足? : vector foo() { : vector x; : for (int i = 0; i < 10; ++i) { : x.push_back(i); : } : return x; : } : vs : vector foo() {
|
N******K 发帖数: 10202 | 3 第二个 里面 即使不用 std::move 也是相当于 move 不会copy
【在 A*******e 的大作中提到】 : 第二个函数里的std::move()是不是画蛇添足? : vector foo() { : vector x; : for (int i = 0; i < 10; ++i) { : x.push_back(i); : } : return x; : } : vs : vector foo() {
|
i**h 发帖数: 424 | 4 第一个依赖编译器优化,第二个是用语言本身通知编译器。最后编译出来的代码(优化
全开的话)应该是一样的。
std::move把可左可右的值强行cast成右值。在第一个x里面可以当右值处理但是要通过
分析中间代码才能看出来。
最后一点就是如果不开优化的话(e.g. debug build)2更有效。 |
A*******e 发帖数: 2419 | 5 第二个函数里的std::move()是不是画蛇添足?
vector foo() {
vector x;
for (int i = 0; i < 10; ++i) {
x.push_back(i);
}
return x;
}
vs
vector foo() {
vector x;
for (int i = 0; i < 10; ++i) {
x.push_back(i);
}
return std::move(x);
} |
x****u 发帖数: 44466 | 6 这可是C++11的重点特性
【在 A*******e 的大作中提到】 : 第二个函数里的std::move()是不是画蛇添足? : vector foo() { : vector x; : for (int i = 0; i < 10; ++i) { : x.push_back(i); : } : return x; : } : vs : vector foo() {
|
N******K 发帖数: 10202 | 7 第二个 里面 即使不用 std::move 也是相当于 move 不会copy
【在 A*******e 的大作中提到】 : 第二个函数里的std::move()是不是画蛇添足? : vector foo() { : vector x; : for (int i = 0; i < 10; ++i) { : x.push_back(i); : } : return x; : } : vs : vector foo() {
|
i**h 发帖数: 424 | 8 第一个依赖编译器优化,第二个是用语言本身通知编译器。最后编译出来的代码(优化
全开的话)应该是一样的。
std::move把可左可右的值强行cast成右值。在第一个x里面可以当右值处理但是要通过
分析中间代码才能看出来。
最后一点就是如果不开优化的话(e.g. debug build)2更有效。 |
g*********e 发帖数: 14401 | 9 一样
但如果std::move(x)用在函数的中间 此行之后x就不能用了
话说这是什么傻逼feature |
k**********g 发帖数: 989 | 10 First example is NRVO (Named Return Value Optimization)
http://en.wikipedia.org/wiki/Return_value_optimization
The first example is internally transformed by the compiler as
void foo ( /* NRVO */ vector < int > & nrvo , ... )
{
vector < int > & x = nrvo ;
...
} |
d****i 发帖数: 4809 | 11 这个解释的清楚,所以还是第一种写法好,既易读易懂符合C/C++习惯规则,又避免了
拷贝操作。
【在 k**********g 的大作中提到】 : First example is NRVO (Named Return Value Optimization) : http://en.wikipedia.org/wiki/Return_value_optimization : The first example is internally transformed by the compiler as : void foo ( /* NRVO */ vector < int > & nrvo , ... ) : { : vector < int > & x = nrvo ; : ... : }
|