跪求:类所占内存大小的问题

lsldd
领域专家: C/C++技术领域
2008-10-29 10:14:25

class A{};
sizeof( A ) = 1 // 1代表什么?

class B
{ void funC() {}; };
sizeof( B ) = 1 // 成员函数不占内存空间?

class C
{ virtual void funC() {}; };
sizeof( C ) = 4 // 如果说4是虚表指针,那么前面2种情况中的那1个字节到哪里去了?

请高手详细解释下,谢谢
...全文
221 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyf19830914 2009-10-05
  • 打赏
  • 举报
回复
学习了
snailman 2008-11-05
  • 打赏
  • 举报
回复
class A{};
sizeof( A ) = 1 // 1代表什么?
=======================
确保 A a,b; //编译器添加的1BYTE
if(&a == &b)能有正确结果

class B
{ void funC() {}; };
sizeof( B ) = 1 // 成员函数不占内存空间?
========================
类的成员函数将会呗编译器放到 class object之外,class object的大小值是 class 的非静态成员变量的大小+编译器放在编译器内的东东的大小

class C
{ virtual void funC() {}; };
sizeof( C ) = 4 // 如果说4是虚表指针,那么前面2种情况中的那1个字节到哪里去了?
===============================================================
确实是虚表指针,为什么要1BYTE??
机智的呆呆 2008-10-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xtting_8984313 的回复:]
这个东西在inside the c++ object有非常详细的描述。
[/Quote]
总起来说 类对象都有自己的非静态成员变量,而共享类的成员函数和静态成员变量~~
sanshao27 2008-10-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 anglecloudy 的回复:]
引用 2 楼 xkyx_cn 的回复:
前面2种情况,1个字节只是一个占位符而已,没有实际意义

第二种成员函数代码所占用内存空间不属于类和对象的空间

第三种情况下已经有一个虚表指针可以标识对象所在地址了,故不再需要占位符来做标识

第一种情况,1个字节只是一个占位符而已,没有实际意义 ,算是C++的规定。

第二种成员函数代码所占用内存空间不属于类和对象的空间,函数只是在类中定义而已,肯定不占空间

第三…
[/Quote]
up
OenAuth.Net 2008-10-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xkyx_cn 的回复:]
前面2种情况,1个字节只是一个占位符而已,没有实际意义

第二种成员函数代码所占用内存空间不属于类和对象的空间

第三种情况下已经有一个虚表指针可以标识对象所在地址了,故不再需要占位符来做标识
[/Quote]
第一种情况,1个字节只是一个占位符而已,没有实际意义 ,算是C++的规定。

第二种成员函数代码所占用内存空间不属于类和对象的空间,函数只是在类中定义而已,肯定不占空间

第三种情况下已经有一个虚表指针可以标识对象所在地址了,故不再需要占位符来做标识
lbzhao_28 2008-10-29
  • 打赏
  • 举报
回复
学习了.
xwguan 2008-10-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liumingrong 的回复:]
前面2种情况是编译器安插的一个“占位符”,用以识别特定的类
成员函数不在类对象的存储空间,它被编译器看作一般函数,只是作了一些变化
楼主对这些问题感兴趣的话,强烈建议你看看《深度探索c++对象模型》
引用楼主 lsldd 的帖子:
C/C++ code
class A{};
sizeof( A ) = 1 // 1代表什么?

class B
{ void funC() {}; };
sizeof( B ) = 1 // 成员函数不占内存空间?

class C
{ virtual void funC() {};…
[/Quote]
up
JJZHK 2008-10-29
  • 打赏
  • 举报
回复
1.一个类的对象既然要在内存里面存在,就一定要有一个地址,而在C++里面,编译器会给一个空类加一个成员比如char,这样,这个空类就不再为空,这个类的对象也就会有一个地址,可以被建立。
2.普通的成员函数的地址是不在类的内存空间中进行存储的。同样的道理,类内部也会有一个char
3.而虚函数导致类内存一个vptr。类本身已经不为空,因此char也就没有必要存在了。
Longinc 2008-10-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xkyx_cn 的回复:]
前面2种情况,1个字节只是一个占位符而已,没有实际意义

第二种成员函数代码所占用内存空间不属于类和对象的空间

第三种情况下已经有一个虚表指针可以标识对象所在地址了,故不再需要占位符来做标识
[/Quote]
UP
xtting_8984313 2008-10-29
  • 打赏
  • 举报
回复
这个东西在inside the c++ object有非常详细的描述。
liumingrong 2008-10-29
  • 打赏
  • 举报
回复
前面2种情况是编译器安插的一个“占位符”,用以识别特定的类
成员函数不在类对象的存储空间,它被编译器看作一般函数,只是作了一些变化
楼主对这些问题感兴趣的话,强烈建议你看看《深度探索c++对象模型》
[Quote=引用楼主 lsldd 的帖子:]
C/C++ code
class A{};
sizeof( A ) = 1 // 1代表什么?

class B
{ void funC() {}; };
sizeof( B ) = 1 // 成员函数不占内存空间?

class C
{ virtual void funC() {}; };
sizeof( C ) = 4 // 如果说4是虚表指针,那么前面2种情况中的那1个字节到哪里去了?



请高手详细解释下,谢谢
[/Quote]
xkyx_cn 2008-10-29
  • 打赏
  • 举报
回复
前面2种情况,1个字节只是一个占位符而已,没有实际意义

第二种成员函数代码所占用内存空间不属于类和对象的空间

第三种情况下已经有一个虚表指针可以标识对象所在地址了,故不再需要占位符来做标识
xtting_8984313 2008-10-29
  • 打赏
  • 举报
回复
// 1代表什么?
编译器插入一个空的,保证 A a[10]里面所有变量有独立的地址。


// 成员函数不占内存空间?
不占,因为编译直接把函数调用了,不需要保存地址,如果是virtual就不一样了,需要一个vtbl

// 如果说4是虚表指针,那么前面2种情况中的那1个字节到哪里去了?
这里不需要插入1里面的多余字节了,因为本身大小大于0,不需要插入。
xxgamexx 2008-10-29
  • 打赏
  • 举报
回复
mark!
wuyu637 2008-10-29
  • 打赏
  • 举报
回复
c++对象模型。。

看这本书去。。
redleaves 2008-10-29
  • 打赏
  • 举报
回复
楼上的都说了...我没什么可说的了..接点分...
帅得不敢出门 2008-10-29
  • 打赏
  • 举报
回复
1个字节只是一个占位符而已,没有实际意义 只是说明这个类型是存在的

第二种成员函数代码所占用内存空间不属于类和对象的空间

第三种情况 有虚函数 所以会有一个指向虚函数地址表指针(vptr) 其占用了4byte

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧