edog

冰冻热狗
数据加载中……

#pragma pack和数据对齐问题

结构数据存放时默认按4对齐,考虑以下程序,输出结果为:sizeof(A)=12
typedef struct _A
{
    
int x;
    
char z[7];
}
A;

void main()
{
    
int len = sizeof(A);
    printf(
"sizeof(A)=%d\n", len);    // len = 12
}


使用 #pragma pack,设置数据按1对齐,此时输出结果为:sizeof(A)=11
#pragma pack(push)
#pragma pack(
1)
typedef 
struct _A
{
    
int x;
    
char z[7];
}
A;
#pragma pack(pop)

void main()
{
    
int len = sizeof(A);
    printf(
"sizeof(A)=%d\n", len);    // len = 11
}

posted on 2005-12-13 14:36 冰冻热狗 阅读(12937) 评论(9)  编辑 收藏 引用 所属分类: 平台核心

评论

# re: #pragma pack和数据对齐问题  回复  更多评论   

无意闯入了贵宝地。正好我也有篇关于这个问题的试验。
http://blog.vckbase.com/zhangjw_cn/archive/2005/08/09/10701.html
2005-12-17 14:54 | 清风雨

# re: #pragma pack和数据对齐问题  回复  更多评论   

class TestA{int a; char b; char c; short d;};
class TestB{int a; char b; short d; char c;};

sizeof(TestA)的值为8,而
sizeof(TestB)的值为12
这是为什么? 是不是多byte的数据成员,只能从偶数偏移位置开始存放?
2007-05-28 16:45 | 偶尔

# re: #pragma pack和数据对齐问题  回复  更多评论   

@偶尔
整数倍的地方开始存放
2007-08-03 17:38 | 路过

# re: #pragma pack和数据对齐问题[未登录]  回复  更多评论   

short d = 2 , 只能从偶数开始放 ;
char c = 1 , 可以从 1 的倍数位置开始放 ;
int a = 4 , 就只好从 4 的倍数位置开始放了啦
2008-09-27 17:58 | Joe

# re: #pragma pack和数据对齐问题  回复  更多评论   

嗯,不错。正好用上
2009-04-02 17:38 | 创意产品网

# re: #pragma pack和数据对齐问题  回复  更多评论   

你好。。。对这个问题。。


1 对齐的意思是什么
2009-04-17 15:14 | 王帅

# re: #pragma pack和数据对齐问题  回复  更多评论   

莫非是。。。。。按照4的整数倍分配内存?

按照1,和按照4对其有什么优缺点没有。
2009-04-17 15:16 | 王帅

# re: #pragma pack和数据对齐问题  回复  更多评论   

#pragma pack(1)和#pragma pack(3)又有什么区别呢
为什么一定是1 求解答
2011-11-06 12:42 | jemmyLiu

# re: #pragma pack和数据对齐问题  回复  更多评论   

涉及两个问题:
数据结构内部的元素按照各自元素的规则对齐;
数据结构按照最严格的成员的来对齐。
2011-12-21 15:37 | yaohuaxin

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理