class a{};class b{};class c:public a,public b{}; 其中sizeof(c)为多少?为什么?

class d:public a{virtual void func()=0};
class e:public b,public d{};
其中sizeof(e)为8
若其中d类不继承a类,那么sizeof(e)却为4
这是为什么

c类继承a、b类,由于 a类 没成员,b类 也没成员, c 也没新成员,所以 编译器把 sizeof(a),sizeof(b),sizeof(c) 都处理成 1。

假定a,b 有成员,就不同了,例如
class a{double x;} -- 8 bytes
class b(int y;} -- 4 bytes
sizeof(c) 就是 16 bytes
编译器 有自己的处理方法,有时说不出多大的道理。追问

关键是与这个的区别class d:public a{virtual void func()=0}; class e:public b,public d{};中的e大小为什么不是4呢

追答

class a{virtual void func()=0;}; class b{};
class d:public a{virtual void func()=0;};
class e:public b,public d{};
这样就是4了。
前面若写 class a{ }; 就不一样了。编译器 有自己的处理方法,说不出多大的道理。

追问

其实我的追问里面是8,1+4,然后字节对齐,但是如果类d没有继承a 那么e的大小才是4,但是完全找不到原理

追答

字节对齐 有时8,有时16,也有时 4。
说是 用宏 #pragma pack(), 用pack(参数)可以调整对齐大小,实际上 有时 编译器 还是不听指挥。确实找不到原理。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-17
事实上,a、b、c都并不是空的,它们“有一个隐晦的1byte,那是被编译器安插进去的一个char。这使得这个class(笔者注:这里指的是a、b或c)的两个objects得以在内存中配置独一无二的地址”,以上这句话摘自侯捷翻译的Stanley著的《深入探索C++对象模型》一书的第84页。

上面的教科书式描述显得很拗口,通俗地说,就是内存不会为空对象分配空间,不带任何成员的类在生成对象时,编译器为了给它分配内存,强制地在该对象中插入了一个字节,以确保该类能够在内存中分配对象;如果该类含有虚拟函数,那么这一byte将不在被分配,因为此时该类具有一个字长的指向虚函数表的指针,对于带有虚函数而不具有任何数据成员的类,它的大小是4个字节(通常情况下),也就是一个内存地址的长度追问

你说的这些我是知道的,但是请看我补充的问题,关键是这两种情况为什么会有区别

第2个回答  2013-09-17
1
c类继承a、b类,但是c类是空类,sizeof(c)求的是空类的字节数。
空类被实例化,编译器隐含添加一个字节的内容,作为唯一地址。追问

实例化的时候添加?那class d:public a{virtual void func()=0}; class e:public b,public d{};中的e大小为什么不是4呢

class a{};class b{};class c:public a,public b{}; 其中sizeof(c)为...
c类继承a、b类,由于 a类 没成员,b类 也没成员, c 也没新成员,所以 编译器把 sizeof(a),sizeof(b),sizeof(c) 都处理成 1。假定a,b 有成员,就不同了,例如 class a{double x;} -- 8 bytes class b(int y;} -- 4 bytes sizeof(c) 就是 16 bytes 编译器 有自己的...

C++中 class A(); 大小是多少?
class A{};VC下大小是1

使用sizeof计算类的大小
public:virtual void fun(void);} 此时sizeof(B)的大小为8,而不是4。因为在类中隐藏了一个指针,该指针指向虚函数表,正因为如此,使得C++能够支持多态,即在运行时绑定函数的地址。2)另一个要注意的是,当类中没有任何成员变量,也没有虚函数的时候,该类的大小是多少呢?例如:class B2 { ...

C++一个继承类继承两个父类,能同时做两个父类指针指向他吗?_百度知 ...
可以。class A{ };class B{ };class C:public A,public B{ };void main(){ C c;A *a;B *b;a=&c;b=&c;}

sizeof()
1 可以,测的是返回值的长度。2 你的这个问题很好。是A的对象,但是··因为静态成员不是堆中分配,而是在常量区,sizeof函数测试对象是只是去堆中看看。不管常量区。3 b还是B的成员,只是不能访问而已,继承是全部继承。然后再看权限。你的问题问的都很好。

C语言中sizeof的用法
实际上sizeof的实现应该是用宏来做的,宏在编译时进行执行。具体实现可以参考下面。 2、sizeof('a')在C语言中的结果是4,在C++中结果是1,看过某篇文章说C中sizeof侧重于“数”,而C++中sizeof更侧重于“字符”。 3、文章中讲了两个用宏实现sizeof的经典应用 复制代码 代码如下: \/\/适用于非数组 #define ...

为什么输出sizeof(stu)是24个字节,不应该是16+1+4=21个吗,求指教,感恩...
c++类的大小是和内存对齐有关系的 16+1+4=21,但是需要内存对齐,所以补足到24

为什么sizeof(&a)的值为400;程序如下:
printf("%d\\n",sizeof(&a));输出的值都是四百,正如前面提到的,他们的地址值是一样的,sizeof本来就是用来求数组的长度的,故得到四百很容易理解;而sizeof(&a)也是四百,是因为它每一次加一,就跳过四百个字节,就好比前面的指针p,因为他是int型的,所以每次跳过4个字节。。。不知讲清楚了没...

若有以下定义和语句,则sizeof(a)的值是__ ___,而sizeof(b)的值是...
a中有两个int ,一个char 。按说应该是 4*2 + 1 =9;但是,有个新手不知道的规则。那就是对齐。就是说,以4个字节为一行(32位),若当前的行中不够放下下一个数据的话,那么就放弃当前行的剩余空间,从下一行开始。于是,变成了 4 + ( 1 + 3【3个字节没有利用,但是依旧占用空间】) +4 = 12;一个...

C++中的函数调用在OC是另外一种称谓,是什么
1,class A: \/\/学生对象 { public:int id;string name;int age;string sex;};第一种创建B的方法:class B:{ public:int classId; \/\/班级编号 A a; \/\/学生对象数组 } \/\/这种方式创建,是直接创建的A a对象,B b;那么当B对象创建的时候,就为a对象分配了空间,也就是a对象被初始化...

相似回答