当前位置: 技术问答>linux和unix
结构体占用内存大小的问题
来源: 互联网 发布时间:2015-05-16
本文导语: 各位大侠: 最近碰到一个很奇怪的问题,我定义了一个结构体。定义如下: struct imagePacketInfo { char corpID[10]; char terminalType[10]; char picFormat[10]; long cameraID; long picID; long totalPks; long curPkID; long dataLen; cha...
各位大侠:
最近碰到一个很奇怪的问题,我定义了一个结构体。定义如下:
struct imagePacketInfo
{
char corpID[10];
char terminalType[10];
char picFormat[10];
long cameraID;
long picID;
long totalPks;
long curPkID;
long dataLen;
char *data;
};
我觉得这个结构体的大小应该是54字节,但是sizeof(struct imagePacketInfo)
却是56,这是为什么?请各位指点
最近碰到一个很奇怪的问题,我定义了一个结构体。定义如下:
struct imagePacketInfo
{
char corpID[10];
char terminalType[10];
char picFormat[10];
long cameraID;
long picID;
long totalPks;
long curPkID;
long dataLen;
char *data;
};
我觉得这个结构体的大小应该是54字节,但是sizeof(struct imagePacketInfo)
却是56,这是为什么?请各位指点
|
字节对齐在不同的机器上处理会不一样的,这样的话相同的结构体在不同的机器上分配的空间可能会不一样。
字节对齐使计算机在内存读取时可以更为高效,计算机体系结构的书籍上面有介绍
如果结构体只在一种平台上使用(比如windows),可以直接使用,不必关心内部如何对齐。
如果结构体会出现在多个平台上(例如前台windows,后台linux),这种就要小心了,否则由于两边对齐方式的不同就会出问题。有一种简单的办法就是打开
#pragma pack(1)
的编译选项,强制单字节对齐,这样结构体的大小就固定了,中间不会添加多余的字节。
#pragma pack()可以恢复默认的对齐方式
我一般在定义通讯使用的结构体时都是这样的
#pragma pack(1)
typedef struct {
char a;
int b;
} ST_CC;
...
#pragma pack()
不过要求编译器支持#pragma这个编译选项,VC6和gcc是支持的
如果不支持的话,就只有搞清楚对齐的处理,在系统会添加多余的对齐字节的地方人为的添加上相应的字节,确实很麻烦,而且结构体不能轻易修改,牵一发会动全身的
字节对齐使计算机在内存读取时可以更为高效,计算机体系结构的书籍上面有介绍
如果结构体只在一种平台上使用(比如windows),可以直接使用,不必关心内部如何对齐。
如果结构体会出现在多个平台上(例如前台windows,后台linux),这种就要小心了,否则由于两边对齐方式的不同就会出问题。有一种简单的办法就是打开
#pragma pack(1)
的编译选项,强制单字节对齐,这样结构体的大小就固定了,中间不会添加多余的字节。
#pragma pack()可以恢复默认的对齐方式
我一般在定义通讯使用的结构体时都是这样的
#pragma pack(1)
typedef struct {
char a;
int b;
} ST_CC;
...
#pragma pack()
不过要求编译器支持#pragma这个编译选项,VC6和gcc是支持的
如果不支持的话,就只有搞清楚对齐的处理,在系统会添加多余的对齐字节的地方人为的添加上相应的字节,确实很麻烦,而且结构体不能轻易修改,牵一发会动全身的
|
char corpID[10];
char terminalType[10];
char picFormat[10];
//会自动在这里插入两个字节,构成32字节,4的倍数。
long cameraID;
long picID;
long totalPks;
long curPkID;
long dataLen;
char *data;
|
那是对齐问题,int需要4字节对齐,short是2字节,char就无所谓了。
|
struct info
{
char str1;
//应该在这里加入了一个字节:)
uint16_t length;
}
可以参考thinking in c++
所有的变量编译时自动在变量大小的边界处对齐!
&(struct info *)0->length = 2
{
char str1;
//应该在这里加入了一个字节:)
uint16_t length;
}
可以参考thinking in c++
所有的变量编译时自动在变量大小的边界处对齐!
&(struct info *)0->length = 2