您的位置:首页 > 编程语言 > C语言/C++

通过汇编看vs2015下c++各标准库的实现原理

2017-02-16 20:04 267 查看
1.std::vector

        共占12字节,为3个指针,分别指向开头,数据的结尾,预留空间的结尾

        example:

                std::vector<int> v {2,3,4};

                则

                size(v) == 12

                &v == 0x1000(右边为可能值)

                [0x1000] == 0x2000(指向开头)

                [0x1004] == 0x200C(指向数据结尾)

                [0x1008] == 0x2010(指向预留空间结尾)(右边为可能值)

                [0x2000] == 2

                [0x2004] == 3

                [0x2008] == 4

2.std::queue
        共占20字节,最后一个4字节保存大小
3.std::forward_list
        共占4字节,为一个指针,指向一个结构体,结构体为8字节,为一个向后指针字段和一个数据保存字段,最后一个向后指针为null

        example:

                std::forward_list<int> v {2,3};

                则

                size(v) == 4

                v == 0x1000(右边为可能值)

                [0x1000] == 0x2000(指向下一个结构体)(右边为可能值)

                [0x1004] == 2(数据)

                [0x2000] == 0(结尾)

                [0x2004] == 3(数据)

4.std::list

        共占8字节,为一个指针和一个整数,指针指向头结点,整数表示结点个数。结构体为12字节,依次为一个向后指针,一个向前指针和一个保存数据的字段

        example:

                std::list<int> v {2,3};

                则

                size(v) == 8

                &v == 0x1000(右边为可能值)

                [0x1000] == 0x3000

                [0x1004] == 2(结点个数)

                [0x3000] == 0x4000(头结点)

                [0x3004] == 0x5000

                [0x3008] == unused

                [0x4000] == 0x5000(第一个结点)

                [0x4004] == 0x3000

                [0x4008] == 2

                [0x5000] == 0x3000(第二个结点)

                [0x5004] == 0x4000

                [0x5008] == 3

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  汇编 vs2015 c++标准库
相关文章推荐