VS中关于字节大小的总结

说明:关于字节对齐的问题,很多人给出的答案是通过设置#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字节。

posted @ 2015-08-21 00:23  CY_K_YC  阅读(870)  评论(0编辑  收藏  举报