免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4103 | 回复: 3
打印 上一主题 下一主题

[转贴]关于内存分配对齐 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-08-28 00:07 |只看该作者 |倒序浏览
在使用gcc的时候,特别是阅读源码的时候会看到
#pragma pack(n)
#pragma pack()

__attribute((aligned ())
__attribute__ ((packed));
下面写一下我的一点认识,不一定对,欢迎指正

这两种方式是gcc的c扩展,用来对齐的,包括栈对齐,变量地址对齐内存分配对齐,这几种方式一般来说gcc是兼容的

#pragma pack(n)
n的取值可以为1、2、4、8、16,在编译过程中按照n个字结对齐
#pragma pack()
取消对齐,按照编译器的优化对齐方式对齐
__attribute__ ((packed));
是说取消结构在编译过程中的优化对齐。
__attribute__ ((aligned (n)));
让所作用的成员对齐在n字节自然边界上,如果结构中有成员的长度大于n,则按照最大成员的长度来对齐

我写了一个小测试程序来测验 struct a
{
int a;
char b;
char c;
}aa; /* 编译器默认对齐方式,32位机器,按照32位对齐 */

#pragma pack(1)
struct b
{
int a;
char b;
char c;
}bb; /* 按照8位对齐 */
#pragma pack()  

#pragma pack(2)
struct c
{
int a;
char b;
char c;
}cc;/* 按照16位对齐 */
#pragma pack()

#pragma pack(4)
struct d
{
int a;
char b;
char c;
}dd;  /* 按照32位对齐 */
#pragma pack()

#pragma pack(
struct e
{
int a;
char b;
char c;
}ee;  /* 按照64位对齐 */
#pragma pack()

#pragma pack(16)
struct f
{
int a;
char b;
char c;
}ff;   /* 按照128位对齐 */
#pragma pack()

struct m
{
int a;
char b;
char c;
}__attribute__((packed)) mm;
/* 取消编译器优化对齐,取实际长度 */

struct n
{
int a;
char b;
}__attribute__((aligned(1))) nn;
/* 按照32位对齐 */

struct o
{
long long a;
char b;
char c;
}__attribute__((aligned(2))) oo;
/* 按照64位对齐 */

struct p
{
int a;
char b;
char c;
}__attribute__((aligned(4))) pp;
/* 按照32位对齐 */


struct q
{
int a;
char b;
char c;
}__attribute__((aligned()) qq;
/* 按照64位对齐 */

struct r
{
int a;
char b;
char c;
}__attribute__((aligned(8*1024))) rr;
/* 按照512位对齐 */

int main()
{

printf("%d,%d,%d,%d,%d,%d\n",
   sizeof(aa),sizeof(bb),sizeof(cc),
   sizeof(dd),sizeof(ee),sizeof(ff));
printf("%d,%d,%d,%d,%d,%d\n",
   sizeof(mm),sizeof(nn),sizeof(oo),
   sizeof(pp),sizeof(qq),sizeof(rr));

return 0;
}


程序运行结果是
[root@A09 joke]#  ./a.out 8,6,6,8,8,8
6,8,12,8,8,64
这样看来,这两种用法已经比较清楚了,但是gcc手册中说了不建议使用 #pragma,而且#pragma最多只能支持16字节的对齐,后者在没有查到资料的情况下,我做了个测试,最多可以支持8192字节的对齐
由于不同编译器可能对对齐的实现有区别,在不同编译器编译的程序间进行数据传递就有可能要用到这些东西了,当然,还有其他的用处

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-08-29 17:54 |只看该作者

[转贴]关于内存分配对齐

辛苦

论坛徽章:
0
3 [报告]
发表于 2004-09-24 12:38 |只看该作者

[转贴]关于内存分配对齐

说align给出sizeof干嘛啊,会弄得人莫名其妙得

论坛徽章:
0
4 [报告]
发表于 2004-09-24 19:24 |只看该作者

[转贴]关于内存分配对齐

关于struct的说明:
1。
An entire structure or union object is aligned on the same boundary as its most strictly aligned member.
2。
Each member is assigned to the lowest available offset with the appropriate alignment. This may require internal padding, depending on the previous
member.
3。
If necessary, a structure’s size is increased to make it a multiple of the alignment. This may require tail padding, depending on the last member.

注意第三句话,这才是你的使用sizeof的理由
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP