关于类大小的,一些问题,纳闷~
怎么会是48呢?请高手解释下原因,谢谢
#include <iostream>
using namespace std;
struct A
{
char c1;
double dl;
char c2;
};
class base
{
public:
char c3;
char c4;
struct A a;
int i;
const int ci;
base():ci(10){}
virtual ~base() = 0 {};
};
class Derived:public base
{
};
void main()
{
int i = sizeof(Derived);
cout<< i <<endl;
return;
}
问题点数:50、回复次数:10Top
1 楼tjsjping(ping)回复于 2006-03-04 11:25:28 得分 13
struct A的大小为24,c1占用1字节,填充7字节,d1、c2类似
c3、c4占用2字节,填充6字节
2+6+24+8+4+4 = 48字节
最后两个4一个是vptr的大小,另外一个是填充的值
Top
2 楼willingbupt(buptcsdn)回复于 2006-03-04 11:59:54 得分 12
在struct中因为double是分配8个字节,所以其它的char分配也是8字节,其余的每个变量都按照变量中分配空间最大的进行填充。Top
3 楼ytfrdfiw()回复于 2006-03-04 13:13:19 得分 15
二楼正解,vptr是指向虚拟函数列表的指针,占4bytes.在以上当中,class base是以8字节对齐的,切勿以为是24字节对齐。它是以struct A中最大字节为对齐标准的,本例中为double。所有的对齐方式是不会以用户定义的类型大小为标准的,只会以机器内部的类型为标准,e.g.:int,double,char etc.Top
4 楼houdy(致力于图像/图形领域,成为有思想的程序员)回复于 2006-03-04 14:28:45 得分 0
对象在内存中的分配受到多方面的影响,其中包括:操作系统,编译器,编译器选项。简单的说就是平台有关的。Top
5 楼Arhero(BigBoy)回复于 2006-03-04 19:15:16 得分 5
支持houdyTop
6 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2006-03-04 19:56:06 得分 0
字节对齐等Top
7 楼yxg80(林夕昱)回复于 2006-03-04 20:00:20 得分 0
学习!Top
8 楼snailbreak(悄悄的来,正如我悄悄的走)回复于 2006-03-04 20:14:32 得分 0
对Top
9 楼ox_thedarkness()回复于 2006-03-04 20:18:08 得分 5
- - 实测了一下,VC7 结果48, dev C++ 结果40,自己算的也是40。我搞不清:
vptr 4
// VC为什么要在这里添一个4字节? 按对齐的目的来说,这个没有必要阿
// 如果vptr 换成一个其他的4字节物体,比如int 或者 void* 也不会加这四个字节
// 为什么VC中, vptr 后面要刻意补齐?
char c3 1
char c4 1
//====================================
结果VC是这样的:
vptr 4
+4
char c3 1
char c4 1
+6
struct A 24
...
//====================================
而DevC++ 是这样的:
vptr 4
char c3 1
char c4 1
+2
struct A 24
...
Top
10 楼mars841215(龙行天下)回复于 2006-03-05 22:10:17 得分 0
就是边界对齐的问题 。。。。
看看Thinking in c++ 就明白了Top




