uninitialized_copy()效果试验

 根据《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

 

posted @ 2019-03-28 20:13  _离水的鱼  阅读(1037)  评论(0编辑  收藏  举报