C++类中包含stl容器时,使用sizeof求大小的问题
2015-11-18 22:45
351 查看
1.说明
这里的大小指的是sizeof(a class object)的值,也就是一个类的对象所占的字节大小,原来我一直认为类的大小会随着类成员中容器元素个数的变化而变化,后来想想又想不通,所以写了下面的代码用来测试。2.测试代码
(1)测试类
class KFoo { public: KFoo(void) { m_nValue = 0; m_cEnd ='0'; m_listValue.clear(); m_vectorValue.clear(); m_mapValue.clear(); }; ~KFoo(void){}; public: inline void SetValue(const int nValue) { m_nValue = nValue; } public: int m_nValue; list<int> m_listValue; //24 vector<int> m_vectorValue; //20 map<int, int> m_mapValue; //28 char m_cEnd; };
(2)测试类大小的函数
#include "Foo.h" #include <Windows.h> #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) { KFoo foo; foo.SetValue(0); foo.m_cEnd = 'a'; printf("begin: Class object foo size = %d\n\n", sizeof(foo)); printf("begin: list size = %d\n", sizeof(foo.m_listValue)); for(int nIndex = 0; nIndex < 1024; ++nIndex) { foo.m_listValue.push_back(nIndex); } printf("begin: list size = %d\n\n", sizeof(foo.m_listValue)); printf("begin: vector size = %d\n", sizeof(foo.m_vectorValue)); foo.m_vectorValue.resize(2048); for(int nIndex = 0; nIndex < 2048; ++nIndex) { foo.m_vectorValue.push_back(nIndex); } printf("begin: vector size = %d\n\n", sizeof(foo.m_vectorValue)); printf("begin: vector size = %d\n", sizeof(foo.m_mapValue)); for(int nIndex = 0; nIndex < 4096; ++nIndex) { foo.m_mapValue.insert(make_pair<int, int>(nIndex, nIndex)); } printf("begin: vector size = %d\n\n", sizeof(foo.m_mapValue)); printf("end: Class object foo size = %d\n\n", sizeof(foo)); system("pause"); return 0; }
3.结果如下图
4.分析
类的大小不会随着成员内容器元素个数的增加而增大,容器中的元素个数增加不会增加容器变量的大小,原因是sizeof是无法求出容器所占的内存的,这些容器申请的大部分空间都是在堆上,栈上只有一部分用于管理的指针,测试得出sizeof(list)=24,sizeof(vector)=20,sizof(map)=28,这个数值和具体的编译器实现有关,测试环境vs2008+Win7 X64,可能不同的环境得出的结果不同。5.另注
以上多为个人理解,有不正确的地方欢迎大家指出!其中把end 打成了begin,map size 打成了 vector size大家能理解就好了,我就不在重新截图了。相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- C#中sizeof的用法实例分析
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- 浅析STL中的常用算法
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法