免费注册 查看新帖 |

Chinaunix

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

关于gcc中字节对齐的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-28 14:04 |显示全部楼层 |倒序浏览

  1. #include<stdio.h>

  2. struct A
  3. {
  4. double l;
  5. int i;
  6. int b;
  7. char c;
  8. };

  9. int main()
  10. {
  11.         struct A m[2];
  12.         printf("%d\n", sizeof(struct A));
  13.         printf("%p\n", &m[0]);
  14.         printf("%p\n", &m[1]);
  15.         printf("%d\n", (int)&m[1]-(int)&m[0]);

  16.         printf("%p\n", &(m[0].l));
  17.         printf("%p\n", &(m[1].l));

  18.         return 0;
  19. }

复制代码


对于上面的代码, 在VC中,结构体A的大小为24, 但是在gcc 中其大小却为20, 这样, 我连续分配两个这个结构体时, 第二个结构体的起始就不是double大小的倍数.  请问为什么在gcc中不将其进行8位对齐? 谢谢.
gcc version
gcc version 4.1.1 20061011 (Red Hat 4.1.1-30)

论坛徽章:
0
2 [报告]
发表于 2007-06-28 14:06 |显示全部楼层

回复 1楼 scutan 的帖子

下面的是运行结果

  1. 20
  2. 0xbff4a19c
  3. 0xbff4a1b0
  4. 20
  5. 0xbff4a19c
  6. 0xbff4a1b0
复制代码

论坛徽章:
0
3 [报告]
发表于 2007-06-28 14:42 |显示全部楼层
原帖由 MMMIX 于 2007-6-28 14:36 发表

楼主用的是 x86 系列的平台吧,x86 的对齐要求不是那么的严格。换其他平台看看。



哦, 不过我这儿也就只有X86平台. 呵呵.
也是, 毕竟字节对齐主要的为了在存取时能够更快速.

论坛徽章:
0
4 [报告]
发表于 2007-06-28 15:07 |显示全部楼层

回复 5楼 zwylinux 的帖子

哦. 明白了, 原来是给它定义成了4. 谢谢!

论坛徽章:
0
5 [报告]
发表于 2007-06-28 20:18 |显示全部楼层
gcc中可以使用

  1. #pragma pack(8)
复制代码

但是我使用了

  1. #pragma pack(8)
复制代码

得到的结果仍然和不使用这一句是一样的, 就是说仍然不是从8的倍数开始的.
请问这是怎么回事呢?
谢谢

[ 本帖最后由 scutan 于 2007-6-28 20:19 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-06-28 20:42 |显示全部楼层
谢谢, 你这种方法可以使之8字节对齐.

另外, 如果不想进行对齐, 可以在编译的时候加上-fpack-struct 这个选项.
或者说声明为

  1. struct A
  2. {
  3.     double l;
  4.     int i;
  5.     int b;
  6.     char c;
  7. } __attribute__ ((packed));

复制代码

[ 本帖最后由 scutan 于 2007-6-28 20:46 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-06-29 19:16 |显示全部楼层
原帖由 gucuiwen 于 2007-6-29 13:17 发表
给LZ一个解决问题的另一种思路吧,开阔一下大家的思维广度:

我曾经待过的一家公司,为了某种需要,反汇编人家老外的软件,
这些软件是针对专门的硬件平台的,

反汇编出来的代码,很多结构体中都有叫fille ...



谢谢. 又学到了一些东西了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP