免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: scutan
打印 上一主题 下一主题

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

论坛徽章:
0
11 [报告]
发表于 2007-06-28 20:26 |只看该作者
原帖由 scutan 于 2007-6-28 20:18 发表
gcc中可以使用

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

但是我使用了

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

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

莫非是 pack(64) ??

对齐可以用
__attribute__ ((aligned (64)))
struct
{
....
};

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
12 [报告]
发表于 2007-06-28 20:32 |只看该作者
原帖由 scutan 于 2007-6-28 20:18 发表
gcc中可以使用

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

但是我使用了

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

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

试下这个:

  1. #include<stdio.h>

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

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

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

  19.     return 0;
  20. }
复制代码

论坛徽章:
0
13 [报告]
发表于 2007-06-28 20:37 |只看该作者

  1. 奇怪,我的__attribute__ ((aligned(8)))不行, sizeof 仍为 20
  2. __attribute__ ((aligned(16)))不行, sizeof 为 24
复制代码

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
14 [报告]
发表于 2007-06-28 20:42 |只看该作者
原帖由 太平绅士 于 2007-6-28 20:37 发表

  1. 奇怪,我的__attribute__ ((aligned(8)))不行, sizeof 仍为 20
  2. __attribute__ ((aligned(16)))不行, sizeof 为 24
复制代码

代码贴出来看看。

论坛徽章:
0
15 [报告]
发表于 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 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
16 [报告]
发表于 2007-06-28 20:53 |只看该作者
原帖由 scutan 于 2007-6-28 20:42 发表
谢谢, 你这种方法可以使之8字节对齐.

另外, 如果不想进行对齐, 可以在编译的时候加上-fpack-struct 这个选项.
或者说声明为
[CODE]
struct A
{
    double l;
    int i;
    int b;
    char c;
} ...

呵呵,这个在驱动代码中和硬件打交道时很方便。

论坛徽章:
0
17 [报告]
发表于 2007-06-28 21:50 |只看该作者
原帖由 太平绅士 于 2007-6-28 20:37 发表

  1. 奇怪,我的__attribute__ ((aligned(8)))不行, sizeof 仍为 20
  2. __attribute__ ((aligned(16)))不行, sizeof 为 24
复制代码


  1. 整体对齐系数=min(max (double, int, char), 4) = 4;
复制代码

注意上面所示 aligned(n)的n大了也没什么用。

论坛徽章:
0
18 [报告]
发表于 2007-06-29 09:03 |只看该作者
原帖由 scutan 于 2007-6-28 20:18 发表
gcc中可以使用

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

但是我使用了

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

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


gcc 好像不支持#pragma pack(n)这个东东

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
19 [报告]
发表于 2007-06-29 12:54 |只看该作者
原帖由 mhello 于 2007-6-29 09:03 发表


gcc 好像不支持#pragma pack(n)这个东东

#pragma pack(n) 是在 gcc 4 中增加的,至少 gcc 3.4 没有这个。

论坛徽章:
0
20 [报告]
发表于 2007-06-29 13:17 |只看该作者
给LZ一个解决问题的另一种思路吧,开阔一下大家的思维广度:

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

反汇编出来的代码,很多结构体中都有叫filler的int型或其他类型变量,

而这些变量在代码中并没有用到,一开始我们都觉得很奇怪,为什么要加上一个并不需要的filler,

后来一个编程大佬告诉我们,这是为了从代码上强制对齐内存,方便移植,适应不同编译器。

看了楼上各位的解决思路,都是从编译器入手,我们为什么不能从代码入手,使得代码适应
任意编译器设置呢?

楼主何不在你的结构体的适当位置也人为的插入一些“填充物”,强制在代码里对齐内存。

使得你的结构体无论用什么编译器都能确保sizeof(struct xx)是你希望得到的数值。

struct mystr {
double l;
int a;
int b;
int filler;
char c;
char filler1;
char filler2;
char filler3;
};

以上只是举个列子,具体情况具体定,有些“填充物”可能是不需要的。

以上结构体我在不同平台不同编译器,得到的大小都是24.

[ 本帖最后由 gucuiwen 于 2007-6-29 13:25 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP