根据《STL源码剖析》这段节选描述,实现如下代码进行测试
#include "2jjalloca.h" #include <vector> #include <iostream> #include <memory> class INT { public: INT(int i) : m_int(i) { cout << "INT()" << endl; } INT(const INT& o) : m_int(o.m_int) { cout << "Copy INT()" << endl; } int value() const { return m_int; } private: int m_int; }; ostream& operator<<(ostream& o, const INT& i) { o << i.value(); return o; } int main(int argc, char **argv) { vector<INT, JJ::allocator<INT>> a = vector<INT, JJ::allocator<INT>>(4, INT(1)); // INT* p = new char[sizeof(INT) * 2]; cout << endl; void* p = ::operator new(sizeof(INT) * 2); uninitialized_copy(a.begin(), a.begin() + 2, (INT*) p); INT* p1 = (INT*) p; cout << p1[0] << ' ' << p1[1] << ' ' << p1[2] << ' '; cout << endl; }
INT()
_allocate
_construct
Copy INT()
_construct
Copy INT()
_construct
Copy INT()
_construct
Copy INT()
Copy INT()
Copy INT()
1 1 0
_destroy
_destroy
_destroy
_destroy
_deallocate
经过测试,的确有拷贝构造。
修改下
int main(int argc, char **argv) { vector<INT, JJ::allocator<INT>> a = vector<INT, JJ::allocator<INT>>(4, INT(1)); // INT* p = new char[sizeof(INT) * 2]; cout << endl; // void* p = ::operator new(sizeof(INT) * 2); uninitialized_copy(a.begin(), a.begin() + 2, a.begin() + 2); // INT* p1 = (INT*) p; // cout << a[1] << ' ' << a[1] ; cout << endl; }
INT()
_allocate
_construct
Copy INT()
_construct
Copy INT()
_construct
Copy INT()
_construct
Copy INT()
Copy INT()
Copy INT()
_destroy
_destroy
_destroy
_destroy
_deallocate
这点不符合STL描述,依旧调用了copy constructor