怎么知道一个类的所占空间的大小?

llsljh 2004-08-19 02:13:31
类的空间大小与什么有关系?
只与里面的数据成员有关吗?还是与所有的成员(函数和数据)都有关系?
...全文
761 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
sungengyu 2004-08-25
  • 打赏
  • 举报
回复
to shornmao :

我说错了,谢谢指正。


-----------------------------------------------------------------------------

shornmao(毛豆子[死猫]) ( ) 信誉:120 2004-8-21 1:20:02 得分: 0



楼上有人说错了,sizeof运算符是不可重载的,如果允许重载的话,编译器可能生成错误的代码,导致程序出错。



梧桐168 2004-08-25
  • 打赏
  • 举报
回复
对象大小= vptr(可能不止一个) + 所有成员大小 + Aligin字节大小
yohua 2004-08-24
  • 打赏
  • 举报
回复
首先,需要知道到底是什么占用空间?
其次,sizeof()的对象是什么?
这样,我想问题应该是比较清楚的了.
请高手清楚指点!
感激
t2659486 2004-08-23
  • 打赏
  • 举报
回复
另外希望注意不要说类的大小,是类的对象的大小.
t2659486 2004-08-23
  • 打赏
  • 举报
回复
#include <iostream.h>
class A
{
};
class B
{
char ch;
void func()
{
}
};
class C
{
char ch1;
char ch2;
virtual void func()
{
}
};
class D
{
int in;
virtual void func()
{
}
};
void main()
{
A a;
cout<<sizeof(a)<<endl;//result=1
B b;
cout<<sizeof(b)<<endl;//result=1
C c;
cout<<sizeof(c)<<endl;//result=8
D d;
cout<<sizeof(d)<<endl;//result=8
}
这个小测试程序可以证明shornmao(毛豆子[死猫])的确是高手,他讲的很完整,up
coyprightbao 2004-08-22
  • 打赏
  • 举报
回复
学习中!!!!
  • 打赏
  • 举报
回复
补充一个例子:
class A {
void f();
};

void A::f() {}

sizeof(A)的值不是零,而是1
-----------------------------
C++标准规定类的大小不为0
空类的大小为1
Andy84920 2004-08-22
  • 打赏
  • 举报
回复
shornmao(毛豆子[死猫])讲的很完整.

fantasydog 2004-08-21
  • 打赏
  • 举报
回复
类的静态变量和类的函数是要占空间的,但是是在程序的初始化栈区里,和全局变量在一起的
huche 2004-08-21
  • 打赏
  • 举报
回复
类的大小只跟成员变量有关系,跟函数和静态成员变量都没有关系!
如果类中,或祖先类中含有虚函数,那么大小要加4,因为编译器编译的时候会自动加个成员变量-指向虚函数表的指针!
当然,还要考虑字节对齐问题。
zhuonline 2004-08-21
  • 打赏
  • 举报
回复
补充一个例子:
class A {
void f();
};

void A::f() {}

sizeof(A)的值不是零,而是1
lzf6633861 2004-08-21
  • 打赏
  • 举报
回复
类的大小用函数sizeof()获得
大小不一定是全部成员的总和,这和有没有虚函数和内存的分布有关
shornmao 2004-08-21
  • 打赏
  • 举报
回复
首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的。
用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。
如果
Class A;
A obj;
那么sizeof(A)==sizeof(obj)
那么sizeof(A)的大小和成员的大小总合是什么关系呢,很简单,一个对象的大小大于等于所有非静态成员大小的总合。
为什么是大于等于而不是正好相等呢?超出的部分主要有以下两方面:
1) C++对象模型本身
对于具有虚函数的类型来说,需要有一个方法为它的实体提供类型信息(RTTI)和虚函数入口,常见的方法是建立一个虚函数入口表,这个表可为相同类型的对象共享,因此对象中需要有一个指向虚函数表的指针,此外,为了支持RTTI,许多编译器都把该类型信息放在虚函数表中。但是,是否必须采用这种实现方法,C++标准没有规定,但是这几户是主流编译器均采用的一种方案。
2) 编译器优化
因为对于大多数CPU来说,CPU字长的整数倍操作起来更快,因此对于这些成员加起来如果不够这个整数倍,有可能编译器会插入多余的内容凑足这个整数倍,此外,有时候相邻的成员之间也有可能因为这个目的被插入空白,这个叫做“补齐”(padding)。所以,C++标准紧紧规定成员的排列按照类定义的顺序,但是不要求在存储器中是紧密排列的。
基于上述两点,可以说用sizeof对类名操作,得到的结果是该类的对象在存储器中所占据的字节大小,由于静态成员变量不在对象中存储,因此这个结果等于各非静态成员的总和加上编译器额外增加的字节。后者依赖于不同的编译器实现,C++标准对此不做任何保证。
dick4610 2004-08-21
  • 打赏
  • 举报
回复
都不知道你们谁说的对, 有的说是类中所有成员总和有的说不是
--------------------------------------------------------------
本来就不是,成员函数不占空间,只是变量和指针占空间而已
shornmao 2004-08-21
  • 打赏
  • 举报
回复
楼上有人说错了,sizeof运算符是不可重载的,如果允许重载的话,编译器可能生成错误的代码,导致程序出错。
leasun 2004-08-20
  • 打赏
  • 举报
回复
sizeof是返回对象大小的操作符。
类本身不占用内存。除非创建了类的对象。
pukkah 2004-08-20
  • 打赏
  • 举报
回复
楼主是要学习C++还是要得到一个答案
lsdkzkald 2004-08-19
  • 打赏
  • 举报
回复
都不知道你们谁说的对, 有的说是类中所有成员总和有的说不是。

renheihei 2004-08-19
  • 打赏
  • 举报
回复
楼主怎么好像在兜圈子
phoenix01 2004-08-19
  • 打赏
  • 举报
回复
请问楼下 类里面成员变量占空间 可它未曾申请空间啊
加载更多回复(9)

64,644

社区成员

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

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