找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3294|回复: 1

关于C++对象占用内存的思考

[复制链接]
发表于 2014-12-30 16:17:01 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
一直有这样几个疑问,C++中一个对象占有多大内存?会不是里面的函数越多,占有的内存就越大?
1:空类占有的内存
  1. #pragma once
  2. class TestClass
  3. {
  4.        
  5. };
复制代码
结果:sizeof(TestClass) = 1
原因:C++要为每一个类在内存中一个独一无二的地址,所以即便是空类也会被分配1个字节来初始化,所以空类的占有的字节是1.
结论:空类也要占用一个字节的内存

2:函数占有内对象的内存吗?
  1. #pragma once
  2. class TestClass
  3. {
  4. public:
  5.         TestClass(void);
  6.         ~TestClass(void);
  7.         void func();

  8. };
复制代码
sizeof(TestClass) = 1
原因:我们在进行成员函数的调用如Object.func(),其实是这样的过程--func(Object.this)。函数虽然在内部声明,但是成员函数的大小不在类的对象里面,而是多个成员对象公用函数,“我们访问类的成员函数是通过类里面的一个指针实现,而这个指针指向的是一个table,table里面记录的各个成员函数的地址(当然不同的编译可能略有不同的实现)”(引号里面的话为copy网上的,感觉还是有点问题的,如果类里面有这样一个指针,岂不是会至少占用四个字节,那么就不会出现空类的大小是1了,应该是直接把Object.func()翻译成 TestClass::func(Object.this) ).

3:仅有数据成员
  1. #pragma once
  2. class TestClass
  3. {
  4. private:
  5.         int  b;
  6. };
复制代码
sizeof(TestClass) = 4

此时类的大小就是其中数据成员的大小

4:字节对齐
  1. #pragma once
  2. class TestClass
  3. {
  4. public:
  5.         TestClass(void);
  6.         ~TestClass(void);
  7. private:
  8.         char c;
  9.         int  b;
  10. };
复制代码
结果:sizeof(TestClass) = 8
原因:char类型只有1个字节,但是为了提高cpu的计算速度,编译器会将1个字节补成4个字节

5:当有静态变量时候
  1. #pragma once
  2. class TestClass
  3. {
  4. public:
  5.         TestClass(void);
  6.         ~TestClass(void);
  7. private:
  8.         char c;
  9.         int  b;
  10.         static int m;
  11. };
复制代码
结果:sizeof(TestClass) = 8
原因:静态变量不占用类对象的内存

6:当有虚函数
  1. #pragma once
  2. class TestClass
  3. {
  4. public:
  5.         TestClass(void);
  6.         virtual ~TestClass(void);
  7. private:
  8.         char c;
  9.         int b;
  10. };
复制代码
结果:sizeof(TestClass) = 12
原因:此时类对象内部有一个指向虚函数表的指针,这个指针会占用4个字节的内存。

参考资料:
http://www.tuicool.com/articles/uiUJry
回复

使用道具 举报

发表于 2014-12-30 16:25:48 | 显示全部楼层
哈哈 这个好
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 18:58 , Processed in 0.034472 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表