免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2007-06-29 14:22 |只看该作者
原帖由 zwylinux 于 2007-6-28 14:56 发表

每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。在lz的程序中,n默认是4。
在 ...



       我怎么看过一篇文章说任何类型(包括自定义结构类型)的数组所占空间的大小一定等于一个单独的该类型数据的大小乘以数组元素的个数

论坛徽章:
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
22 [报告]
发表于 2007-06-29 16:41 |只看该作者
原帖由 gucuiwen 于 2007-6-29 13:17 发表
给LZ一个解决问题的另一种思路吧,开阔一下大家的思维广度:

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

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

这个也算是常见方法了。不过最开始有人针对楼主的问题给出使用 pragma 的解决方案,大家就顺着往下讨论了下罢了。

另外,某些代码,例如说 Linux 内核,明确指明是依赖于特定编译器的,此处为 gcc,这时使用特定编译器的扩展就更方便些、也更可取些。

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

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

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



谢谢. 又学到了一些东西了!

论坛徽章:
0
24 [报告]
发表于 2007-06-29 19:28 |只看该作者
长了一些见识,
#pragma pack(1) 可以省空间

论坛徽章:
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
25 [报告]
发表于 2007-06-29 19:53 |只看该作者
原帖由 netfarming 于 2007-6-29 19:28 发表
长了一些见识,
#pragma pack(1) 可以省空间

这个要看你怎么取舍了,空间 vs. (执行)效率。

论坛徽章:
0
26 [报告]
发表于 2007-06-30 01:14 |只看该作者
原帖由 specter117 于 2007-6-29 14:22 发表



       我怎么看过一篇文章说任何类型(包括自定义结构类型)的数组所占空间的大小一定等于一个单独的该类型数据的大小乘以数组元素的个数


你的说法只是对数组而言的。

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

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

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


对于filler,我也说两句。本人正好这两天看了linux下ld方面的东西,我估计你反汇编的老外的代码是用GNU的工具编译和链接的。从该软件针对专门的硬件平台可以猜测出一二。

对程序中使用数据的内存对齐并不是在编译的时候完成的,实际上是在程序链接的时候完成的。linux下也就是执行ld,做数据内存布局的时候,根据在编译阶段分析出来的各个数据的对齐要求完成的。可以通过FILL()命令或者=FILEEXP来制定使用什么数值来填充内存空隙。

所以反汇编的时候,会看到这些填充的数据。
基本上来说常规的方法还是使用gcc的选项或者宏,来满足内存对齐的要求,把填充的事情交给连接器做。

同时我也有一个问题请教,不知道gucuiwen当时用的是什么反编译工具,能看到变量的名字。或者还是文件中符号信息没有去掉?

[ 本帖最后由 Benson_linux 于 2007-6-30 08:59 编辑 ]

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

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

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


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

请教一下 如何知道 这个结果一定是24字节? int 在不同平台应该长度不一样 4byte 或者 2byte. double 也不一定。

这是如何确定的?  

char c 后面加了 filter 只能确保 是4个byte.  也就是他们是按照 8 个byte 为一个单位来设置的. 所以这里假设double 是8 byte
int a int b 又是8
intfile + char c  char filer1 file2 fille3 是8
char c  一个字节多占了7

论坛徽章:
0
29 [报告]
发表于 2007-11-10 14:59 |只看该作者

  1. #include<stdio.h>

  2. struct A{
  3.    double a;
  4.    int b;
  5.    int c;
  6.    char d;
  7. }__attribute__ ((aligned(packed)));

  8. int main(){
  9.    struct A a[2];
  10.    printf("%d\t%p\n%d\t%p\n",sizeof(a[0]),&a[0],sizeof(a[1]),&a[1]);
  11.    return 0;
  12. }
复制代码

这段代码在winXP+GCC3.42上面,无论packed是8还是4,结果都是

  1. 24      0022FF40
  2. 24      0022FF58
复制代码

如果packed为16,那么就是

  1. 32      0022FF30
  2. 32      0022FF50
复制代码


packed为8或4的时候为什么都是按8对齐的呢?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:03
30 [报告]
发表于 2008-03-22 09:38 |只看该作者
我是 gcc version 4.2.3

用楼主代码 #pragma pack(4) 或是 #pragma pack( 在我linux gcc 还是 显示 20字节大小?

#pragma pack(  应该是 24 字节大小不是吗?

#pragma pack(n)  在 gcc version 4.2.3  应该有支援吧  

__attribute__ ((aligned(n)));  , n 我测试 1 , 2  都不行?

__attribute__ ((aligned(n)));  , n =  4, 8, 16 正确

请问这是什么原因?

谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP