由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C++ copy elision和move的区别?
相关主题
问个C++ 编译器临时变量的问题 (转载)C语言的变量都一定要放在stack上吗?
急,VC7.1编译错误有关objec access path的问题
请教个Bloomberg 的 C++ 题目关于C++中一个Class的大小 (转载)
以下两个C 代码是不是完全等价?windows下面的c++有什么免费的好用的ide?
Remove elements from multiple vectors in C++【求助】Centos里面怎么没有g++? (转载)
请问STL里有没有类似dot_product的算法为什么在overloading中,friend <<不能读取private值呢?
What's the most efficient way to transform a 2d array intoC怪问题一个
关于内存泄漏问个简单的memory allocation 的问题。
相关话题的讨论汇总
话题: int话题: vector话题: move话题: std话题: foo
进入Programming版参与讨论
1 (共1页)
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 ;
: ...
: }

1 (共1页)
进入Programming版参与讨论
相关主题
问个简单的memory allocation 的问题。Remove elements from multiple vectors in C++
[合集] 请问大家都用什么C++编译器?请问STL里有没有类似dot_product的算法
delete[]的设计很不好What's the most efficient way to transform a 2d array into
[合集] 很中肯的批评 STL关于内存泄漏
问个C++ 编译器临时变量的问题 (转载)C语言的变量都一定要放在stack上吗?
急,VC7.1编译错误有关objec access path的问题
请教个Bloomberg 的 C++ 题目关于C++中一个Class的大小 (转载)
以下两个C 代码是不是完全等价?windows下面的c++有什么免费的好用的ide?
相关话题的讨论汇总
话题: int话题: vector话题: move话题: std话题: foo