我正在阅读关于c ++中的复制省略。我使用这个副本省略来对c ++中的STL产生怀疑。
以下代码:
#include <vector>
#include <iostream>
using namespace std;
vector<int> merge(vector<int> &arrA, vector<int> &arrB)
{
int x;
vector<int> result;
for(x = 0; x < arrA.size(); x++)
{
result.push_back(arrA[x]);
}
for(x = 0; x < arrB.size(); x++)
{
result.push_back(arrB[x]);
}
cout << "fun return: " << &result <<endl;
return result;
}
int main(int argc, char const *argv[])
{
vector<int> arrA;
arrA.push_back(1);
vector<int> arrB;
arrB.push_back(2);
vector<int> res;
res = merge(arrA, arrB);
cout << "return: " << &res <<endl;
return 0;
}
所以我做了一个简单的任务(合并)向量A和B(不要注意过程,只关注函数和返回。
vector<int> merge(vector<int> &arrA, vector<int> &arrB)
通过以下定义,它返回vector<int>
(无参考)
还有return result;
,它是函数范围中声明的变量。
我试图查看这些vectores所在的内存地址。 输出:
==5036== Memcheck, a memory error detector
==5036== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==5036== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==5036== Command: ./a.out
==5036==
fun return: 0xffefffe40
return: 0xffefffe20
==5036==
==5036== HEAP SUMMARY:
==5036== in use at exit: 0 bytes in 0 blocks
==5036== total heap usage: 5 allocs, 5 frees, 28 bytes allocated
==5036==
==5036== All heap blocks were freed -- no leaks are possible
==5036==
==5036== For counts of detected and suppressed errors, rerun with: -v
==5036== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
内存地址对于两者都不同所以我认为只要它不会复制 - 构造,它最后会是相同的内存地址(0xffefffe40)这是否意味着它是复制构造的?< / p>
这种方法是复制省吗?
重要的一点是:如果这不是复制省,那么可以做到吗?在STL中进行复制省略需要什么?
答案 0 :(得分:1)
对于复制省略,您需要复制&#34;复制&#34;首先,即你的res
向量必须从返回值复制构造
否则你只需要一个任务,这需要摆脱向量中的任何内容,因此不能被省略。
请注意,它仍然是一个移动分配,因此缺点不会那么多(您也可以使用memcheck进行测试)。