标签:
说明:关于字节对齐的问题,很多人给出的答案是通过设置#pragma pack (1)的方式进行操作。但是在不是很考虑空间占用或者不是发送协议包等情况下,为了让程序跑的更快,是不会进行该设置。
以下均以默认的字节对齐方式
1、在结构体中,使用的字节数对齐方式是寻找结构体中的关键字的最大占用字节数(默认最小是4字节)
比如:
struct Node {
int a;
double b;
};
则sizeof(Node)的大小就是16字节而不是所谓的12个字节,因为是以结构体关键字(double)的字节数是8字节,所以以该大小为字节对齐方式。
如果是这样子:
struct Node {
int a;
double b;
char c;
}
则sizeof(Node)的大小就是24字节了
2、关于成员函数指针占用的空间大小,具体的可以详见下面的链接
http://www.linuxeden.com/html/news/20141206/157482.html
注意,如果是这样子:
class Base;
typedef (Base::*Func)();
则Func占用了16字节
如果
class Base;
class Base{};
typedef (Base::*Func)();
那么Func只占用了四个字节。也就是说只要class Base定义在typedef (Base::*Func)();之前出现,那么它将只是占用简单的对应字节数。
3、那么如果将成员函数指针也放进结构体里面,那会产生怎样的情况呢
这里声明一个类
class Base;
typedef (Base::*Func)();
通过第二点的链接我们知道这里的sizeof(Func)的大小是16字节
那么如下例子
struct Node {
int a;
Func func;
double b;
}
sizeof(Node)应该占用多少的空间呢? 答案是8+16+8 = 32字节。既然结构体以最大的占用空间计算,那么为什么是32字节而不是48字节呢? 其实对齐方式正如我上面说的关键字(double),是C++定义的关键字。所以只占用了32字节。
标签:
原文地址:http://www.cnblogs.com/cxiaoln/p/4746620.html