通过汇编看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
共占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++创建DLL并用C#调用且同时实现对DLL的调试
- C++ 遍历指定进程的线程列表,在 VS2015 测试通过,已添加中文注释。
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
- 在VS2015中用C++创建DLL并用C++调用且同一时候实现对DLL的调试
- 在VS2015中用C++创建DLL并用C++调用且同时实现对DLL的调试
- C语言中的可变参数-printf的实现原理 在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出
- 【VS2015】c++实现windows系统版本、类型、语言识别
- 通过两个汇编实例对高级语言数组实现原理的发现
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
- 从 Arm 汇编看 Android C++虚函数实现原理
- 在VS2015中用C++创建DLL并用C++调用且同时实现对DLL的调试
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
- 【C++学习笔记】标准库容器Vector可变长度实现原理
- 【VS2015】 C++实现硬件ID的查询
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
- 探索VS中C++多态实现原理
- 利用VS2015实现C++与matlab混合编程:
- 通过两个汇编实例对高级语言数组实现原理的发现
- 小字典之MFC简单的多线程调用类的成员函数实现逐步画线功能 VS2015 C++ 完成