首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
编程语言
> 详细
1)C++对象大小计算
时间:
2014-12-10 23:59:52
阅读:
403
评论:
0
收藏:
0
[点我收藏+]
标签:
style
io
ar
sp
on
div
问题
as
size
? ? ? C++对象的大小不同的编译器的实现是不一样的,以下仅讨论.net2003,其他编译的可能出现的结果以下也做了分析和猜测。在反推不同编译器实现的C++对象的大小时。对齐是一个很重要也容易被遗忘的问题。
class A{}; ? ? ?
类A是一个空类,但是它的大小并不为0,编译期间编译器会插入一个char在其中,这个char我们是看不到的,这样的用处是保证生成的不同对象具有不同地址,就是要对象里有东西。
class B:public virtual A{};
B类是对A类的虚继承,B中一般会有指向A的实例的指针,在IA-32下为4bytes。这里不同编译器的实现差别很大,有的编译器在B的对象中也 ? ? 会保留A类的那个隐含的char,于是就有1+4=5个bytes,再考虑对齐,有些编译器产生的结果为8bytes,但是在.net2003中优化过了,不会有A中的char,也就不需要对齐,只有4bytes大
class C:public virtual A{};
//同上
class D:public B,public C{};
? //D为8,如果编译器不优化A中的char就会有1(A)+8(B)+8(C)-4(B对A虚继承)-4(C对A虚继承)+3(对齐)=12bytes
class E{
? ? ? int i;
?};//很明显4bytes
class F{
? ? ? double d;
};//很明显8bytes
class G{
? ? ? double num;
?
? ? ? char in;??
?
};
//8bytes对齐,所以是8(double)+4(int)+4(对齐)=16
class H
{
? ? ? int num;
?
? ? ? double in;???
?
};//同上
class I{
? ? ? int num;
?
? ? ? double in;???
?
public:
? ? ? virtual ~I(){};
};//8(double)+4(int)+4(对齐)+4(vptr)+4(对齐)=24
class J{
? ? ? double num;
?
? ? ? int in;????
?
public:
? ? ? virtual ~J(){};
};//同上8(double)+4(int)+4(对齐)+4(vptr)+4(对齐)=24
class K{
? ? ? int i;
? ? ? int k;
public:
? ? ? virtual ~K(){};
};//4(int)+4(int)+4(vptr)=12
class L{
? ? ? int i;
? ? ? int j;
? ? ? L(){};
public:
? ? ? float ll(int i) {
? ? ? ? ? ? ?return 0.0;
}
static int hhh(int i) {
? ? ? return 0.0;
}
? ? ? ? ? virtual ~L(){};
? ? ? ? ? ? ? ?virtual ji(){};
? ? ? ? ? };
//虚函数表的指针vptr,只有类中出现虚函数才会出现,它指向虚函数表,所有虚函数的地址存放在此表中。
//4(int)+4(int)+4(vptr)=12从中看出,不管有多少虚函数,大小不变,因为类中之保存虚函数表。
//不管成员函数有多少,类大小也不变,因为他们不保存在对象中,无论是否是静态
int main(){
? ? ?cout <<"A "<<sizeof(A)<<endl;
? ? ?cout <<"B "<<sizeof(B)<<endl;
? ? ?cout <<"C "<<sizeof(C)<<endl;
? ? ?cout <<"D "<<sizeof(D)<<endl;
? ? ?cout <<"E "<<sizeof(E)<<endl;
? ? ?cout <<"F "<<sizeof(F)<<endl;
? ? ?cout <<"G "<<sizeof(G)<<endl;
? ? ?cout <<"H "<<sizeof(H)<<endl;
? ? ?cout <<"I "<<sizeof(I)<<endl;
? ? ?cout <<"J "<<sizeof(J)<<endl;
? ? ?cout <<"K "<<sizeof(K)<<endl;
? ? ?cout <<"L "<<sizeof(L)<<endl;
}
/*******************************************************************/
?output .net2003
? ? ?A 1
? ? ?B 4
? ? ?C 4
? ? ?D 8
? ? ?E 4
? ? ?F 8
? ? ?G 16
? ? ?H 16
? ? ?I 24
? ? ?J 24
? ? ?K 12
? ? ?L 12
1)C++对象大小计算
标签:
style
io
ar
sp
on
div
问题
as
size
原文地址:http://www.cnblogs.com/weilf/p/4156523.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
Spring Cloud 从入门到精通(一)Nacos 服务中心初探
2021-07-29
基础的排序算法
2021-07-29
SpringBoot|常用配置介绍
2021-07-29
关于 .NET 与 JAVA 在 JIT 编译上的一些差异
2021-07-29
C语言常用函数-toupper()将字符转换为大写英文字母函数
2021-07-29
《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)
2021-07-28
4-1 YAML配置文件 注入 JavaBean中
2021-07-28
【python】 用来将对象持久化的 pickle 模块
2021-07-28
马拉车算法
2021-07-28
用Python进行冒泡排序
2021-07-28
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!