金华婺城区建设局网站,丹东seo优化效果费用,建设网站怎样挣钱,手机网站建设域名空间什么是字节对齐
1.空类
class A
{}对空类做sizeof#xff08;#xff09;计算时应当等于1
2.带虚函数的类
如果有一个类#xff0c;包含两个32位整型的数据成员#xff0c;一个普通成员函数#xff0c;还有一个virtual虚函数#xff0c;在32位机器上#xff0c;这个…什么是字节对齐
1.空类
class A
{}对空类做sizeof计算时应当等于1
2.带虚函数的类
如果有一个类包含两个32位整型的数据成员一个普通成员函数还有一个virtual虚函数在32位机器上这个类sizeof()计算的时候得到多少编译是4字节对齐
32位机器
#pragma pack(4)
class K
{
public:int a;int b;void fun(); virtual void fun1();
};
#pragma pack()a占4个字节 b占4个字节 void fun不占用内存 因为有一个virtual虚寒函数有一个虚函数指针32系统中占用4个字节
所以占用12个字节。
如果变成8字节对齐呢应该是多大
#pragma pack(8)
class K
{
public:int a;int b;void fun(); virtual void fun1();
};
#pragma pack()也许你会觉得是16但是正确的结果是12. 为什么依然还是12呢 因为字节对齐的规则规定 对于结构体他的有效对齐值是#pragma pack()和该结构体中最大数据成员两者中的较小的那个值。 这里#pragma pack(8)值为8但K class中最大数据成员为4个字节所类K依然按照4字节对齐。
如果一个成员函数变成2个成员函数呢
#pragma pack(8)
class K
{
public:int a;int b;void fun(); void fun2();virtual void fun1();
};
#pragma pack()sizeofK依然是占用12个字节。 因为成员函数不占用类对象的内存的。
如果增加一个虚函数变成两个虚函数了呢
#pragma pack(8)
class K
{
public:int a;int b;void fun(); void fun2();virtual void fun1();virtual int fun3();
};
#pragma pack()sizeofK依然是占用12个字节。 因为每个类只维护一个虚函数指针所有的虚函数都放在虚函数表中呢。 32位系统中指针占用4个内存。
再增加一个char类型大小会变成多少
#pragma pack(8)
class K
{
public:int a;int b;char c;void fun(); void fun2();virtual void fun1();virtual int fun3();
};
#pragma pack()答案是16字节 虽然#pragma pack为8但K类最大数据成员大小占4个字节 所以K类按照4字节对齐。 a占4个字节0-3 b占4个字节4-7 c占一个字节8-11 虚函数表指针必须从4的倍数开头12-15
64位机器
#pragma pack(4)
class K
{
public:int a;int b;void fun(); virtual void fun1();
};
#pragma pack()答案是16字节 因为64位机器下虚函数表指针为8个字节
如果增加一个char 变量
#pragma pack(4)
class K
{
public:int a;int b;char c;void fun(); virtual void fun1();
};
#pragma pack()答案是20个字节因为有效对齐值为4
地址编号0123aaaa地址编号4567bbbb地址编号891011c地址编号12131415vptrvptrvptrvptr地址编号16171819vptrvptrvptrvptr
如果编译改成8字节对齐呢
#pragma pack(8)
class K
{
public:int a;int b;char c;void fun(); virtual void fun1();
};
#pragma pack()答案是24个字节 因为8字节对齐vptr需要从8的倍数开始存储。
地址编号0123aaaa地址编号4567bbbb地址编号891011c地址编号12131415地址编号16171819vptrvptrvptrvptr地址编号20212223vptrvptrvptrvptr