永发信息网

在C++中一个类对象究竟占用多少内存

答案:1  悬赏:30  手机版
解决时间 2021-04-14 02:15
在C++中一个类对象究竟占用多少内存
最佳答案
一、空类的Size
class Car
{
};

void main()
{
int size = 0;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}

输出结果:Class Car Size:1

这是为何呢?我想对于这个问题,不仅是刚入行不久的开发新手,就算有过几年以上C++开发经验的开发人员也未必能说清楚这个。
编译器在执行Car objCar;这行代码后需要,作出一个Class Car的Object。并且这个Object的地址还是独一无二的,于是编译器就会给空类创建一个隐含的一个字节的空间。

二、只有成员变量的Size
class Car
{
private:
int nLength;
int nWidth;
};

void main()
{
int size = 0;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}

输出结果:Class Car Size:8
这个结果很多开发人员都清楚。在32位系统中,整型变量占4个字节。这里Class Car中含有两个整型类型的成员变量,所以Class Size是8。

class Car
{
private:
int nLength;
int nWidth;
static int sHigh;
};

void main()
{
int size = 0;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}
输出结果:Class Car Size:8
我们这次在Class Car中添加了一个静态成员变量,但是Class Size仍然是8个字节。这正好符合了,结论中的第一条:非静态成员变量总合。

class Car
{
private:
char chLogo
int nLength;
int nWidth;
static int sHigh;
};

void main()
{
int size = 0;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}
输出结果:Class Car Size:12
在类中又插入了一个字符型变量,结果Class Size变成了12。这个就是编译器额外添加3个字符变量,做数据对齐处理,为了是提高CPU的计算速度。编译器额外添加的东西我们是无法看见的。这也符合了结论中的第二条:加上编译器为了CPU计算,作出的数据对齐处理。
既然,我们这样定义类成员数据编译器会额外的增加空。那么,我们何不在定义类的时候就考虑到数据对齐的问题,可以多定义出3个字符类型变量作为预留变量,既能满足数据对齐的要求,也给自己的程序添加了一些可扩展的空间。

三、只有成员函数的Size
class Car
{
public:
Car(){};
~Car(){};
public:
void Fun(){};
};

void main()
{
int size = 0;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}
输出结果:Class Car Size:1
噢,这是怎么回事儿呢?再做一个实验看看。
class Car
{
public:
Car(){};
~Car(){};
public:
void Fun(){};
private:
int nLength;
int nWidth;
};

void main()
{
int size = 0;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}
输出结果:Class Car Size:8
这次应该很清楚的了。函数是不占用类空间的。第一个例子中的Size为1个字节,正是编译器为类创建一个隐含的一个字节的空间

class Car
{
public:
Car(){};
virtual ~Car(){};
public:
void Fun(){};
};

void main()
{
int size = 0;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}
输出结果:Class Car Size:4
这次,让析构函数为虚函数,看到了Class Size为4。这正是指向Virtual Table的指针vptr的Size。这正好符合了,结论中的第三条:加上为了支持虚函数,产生的额外负担。

到此为止,一个Class Object究竟占用多少内存空间,已经完全说清楚了。但是,这只是针对单独类,或者说是基类适用。对于子类,却不一样了。有兴趣的朋友可以做一些实验。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
电池接触不良去修要不要钱
诺基亚1600的保护密码好多
女神新衣怎么去啊,有知道地址的么
哪位朋友能给个传奇世界的号玩玩?级数高点的
长安汽车好还是。 广汽传奇的好啊 ????
诺基亚6220c有什么优缺点?
穿越火线啥时公测的?
The weather in this area is generally warm
明年公司计划上BI,国外的太贵了,有谁能推荐
平板忘记id密码了,被锁了怎么办 20分
跑跑的棉花糖SR
把抛物线y=x^2+bx+c向左平移3个单位,再向上
比贵人更高一个层次的是什么词语?
书法虎字写法
美丽驿站地址在什么地方,我要处理点事!
推荐资讯
怎么克制自己上课发呆?
这样的配置如何?主要玩游戏,不超频...稳定
雷霆基地军服产品在哪?
布嘉迪-悬崖逆行(键盘)背景音乐
液晶电视上TVIN是什么意思
单选题当你的合法权益遇到不法侵害需要与侵害
中国什么品牌的电脑最好?
不会说话的帅哥有爱吗
在广东中山用什么宽带好
真的爱我吗?
我是1993年3月22**算爱情
“和谐颂”绘画展
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?