设为首页 加入收藏

TOP

C++中类对象的内存布局和占用空间
2014-11-24 11:50:16 来源: 作者: 【 】 浏览:0
Tags:对象 内存 布局 占用 空间

很多C++书籍中都介绍过,一个Class对象需要占用多大的内存空间。最权威的结论是:
*非静态成员变量总合。


*加上编译器为了CPU计算,作出的数据对齐处理。


*加上为了支持虚函数,产生的额外负担。


介绍完了理论知识后,再看看再找一个例子看看(注:一下所有结果都是在VC6.0 开发环境中得出的结论)


一、空类的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个字符类型变量作为预留变量,既能满足数据对齐的要求,也给自己的程序添加了一些可扩展的空间。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言中的多字节字符与宽字符 下一篇HTML5 地理位置定位(HTML5 Geolo..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·About - Redis (2025-12-26 08:20:56)
·Redis: A Comprehens (2025-12-26 08:20:53)
·Redis - The Real-ti (2025-12-26 08:20:50)
·Bash 脚本教程——Li (2025-12-26 07:53:35)
·实战篇!Linux shell (2025-12-26 07:53:32)