- 论坛徽章:
- 2
|
[Effective modern C++]上面说,vector::push_back当capacity不够的时候,会申请一块新的内存,把原有的内容copy或者move过去。
根据一个类的move构造函数是否是noexcept来判定,这样能够保证迁移到新的内存块的时候,有exception safety.
于是我做了一个实验
- #include<iostream>
- #include<vector>
- using namespace std;
- struct A{
- A(){}
- A(const A&){ cout << "copy ctor\n"; }
- A(A&&){ cout << "move ctor\n"; }//是否noexcept,影响结果
- };
- int main()
- {
- vector<A> vi(2);
- size_t c = 0;
- cout<<"========\n";
- for (size_t i = 0; i<4; ++i)
- {
- cout<<"push_back...........\n";
- vi.push_back(A());
- if (vi.capacity()>c)
- {
- c = vi.capacity();
- cout << c << endl;
- }
- }
- return 0;
- }
复制代码 GCC/clang运行这个程序,push_back如果capacity不够了,那么会把原有的元素copy一份。如果我把move语义构造函数改成A(A&&)noexcept签名,那么调用的就是把原有的元素move一份。
这个和书上说的是一样的。
但是VC2013/2015我做的测试,无论我有没有加上noexcept,都是用move语义去搬移元素到新的内存块。这是VC实现的问题吗?
还是说,VC有特别的编译选项控制exception safe,默认是关闭的,打开了才是和GCC/clang一样的行为?
谢谢 |
|