64,651
社区成员
发帖
与我相关
我的任务
分享
lz记住,变量的存放是不能跨段域的!
如果在一个段能存放下,就存,不能就得空着
像你说的:
class E
{
public:
float f;//4
short int si;//2
short int sii;//2
};
因为si和sii能在一个段域里存放下,所以就放一个段域了
如果sii是int型的,那么就是3*4=12
因为si后面的俩字节得空着,sii不能跨段!
按float类型补齐,也就是4字节补齐
而short int是俩字节
所以,存放的时候是:
前四字节是f,接着俩字节是si,然后又是sii俩字节。
存放规则:
按最大的类型对齐:
不能跨段域
然后依次放入:
比如:
int a
char b
int c
那么放的时候就是:
按四个字节对齐
a占四个字节
b占俩字节
c占四个字节,而由于b占了俩字节,那么b后面 的俩字节就得空着,c不能跨段域
所以是
a占四个字节
b占俩字节,后面俩字节空,也是四个字节
c占四个字节
所以是3*4
#include<iostream>
using namespace std;
class A
{
public:
double d;//8
float a;//4
int b;//4
char c;//1
};
class B
{
public:
float f;//4
char p;//1
int adf[3];//12
};
class C
{
};
class D
{
public:
D(){cout <<"dddd" <<endl;}
~D(){cout <<"_____" <<endl;}
virtual void f(int){cout <<"fff_int" <<endl;}
virtual void f(double){cout <<"fff_double" <<endl;}
void g(int i = 10){cout <<"ggg " <<i <<endl;}
};
int main(){
cout <<sizeof(A)<<endl;//输出24
以double型所占字节数对齐,也就是8字节对齐,
第一个八字节是d,第二个八字节是a、b,第三个八字节是c。后面有空位,但是对齐,所以空着就空着,3*8=24
cout <<sizeof(B)<<endl;
//我做的答案是以12来对齐,得到24,给的正确答案是20。请懂得同学帮忙解释下为什么以4字节对齐~
以float型对齐,也就是4字节对齐
int数组相当于三个,那么就是4*5=20
cout <<sizeof(C)<<endl;//答案说是1字节,空的类都有1字节,那么请问this指针都有4字节啊?!怎么保存this指针呢?
汗~~~~~~~~~~
cout <<sizeof(D)<<endl;
//答案给的4字节,因为只有一个指针,请问这个指针是什么?
//虚表指针还是this指针,如果是this指针,那么请看上一个问题。
虚函数表指针
return 0;
}