Chinaunix首页 | 论坛 | 博客
  • 博客访问: 96350
  • 博文数量: 41
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 486
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-18 20:09
文章分类

全部博文(41)

文章存档

2016年(1)

2015年(1)

2014年(9)

2013年(30)

我的朋友

分类: C/C++

2013-05-06 15:23:29

内存对齐的规则:

1、  对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是-----------min(#pragma pack()指定的数,这个数据成员的自身长度)------- 的倍数。

2、  在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照---------#pragma pack指定的数值和结构(或联合)最大数据成员长度中---------------,比较小的那个进行。

#pragma pack(n) 表示设置为n字节对齐。 VC6默认8字节对齐, gcc 32位默认4字节对齐, gcc 64位默认是8字节对齐
struct test
{
char a;
double b;
};
在vc下 sizeof(test)=16;
gcc下sizeof(test)=12;
总结:内存对齐在不同平台不同编译器是有区别的,所以如果服务器是Linux, 客户端是windows, 网络传输struct,要指定pragma pack(4)


struct test
{
char a;
int b;
}
sizeof(test)=8

struct test
{
char a[10];
int b;
}
sizeof(test)=16

struct test
{
char a[3];
int b;
char c;
}
sizeof(test)=3+1+4+1=9,要被4整除,则sizeof(test)=12

· 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
· 使用伪指令#pragma pack (),取消自定义字节对齐方式。
#pragma pack(1)
struct test
{
char a[3];
int b;
}
#pragma pack();
sizeof(test)=7

url:
http://www.cppblog.com/snailcong/archive/2009/03/16/76705.html
http://blog.csdn.net/nick_wong/article/details/7778063

阅读(472) | 评论(0) | 转发(0) |
0

上一篇:pc-lint安装

下一篇:字节序

给主人留下些什么吧!~~