gcc编译器的默认字节对齐方式是什么?

aozhi 2009-09-11 02:56:31
问题如题。
OS:RedHatEnterPrise Linux AS(V4)
编译器:gcc 4.1.2
...全文
2077 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
不知名小ITer 2009-09-14
  • 打赏
  • 举报
回复
32位的是4字节对齐,自己写个代码测试下就行了。
  • 打赏
  • 举报
回复
gcc文档中不是明确的说了么 On x86-64, `-malign-double' is enabled by default.
默认是-malign-double
aozhi 2009-09-13
  • 打赏
  • 举报
回复
还想听听别的方法。再过几天结帖。
多谢楼上各位。
aozhi 2009-09-13
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 hpsmouse 的回复:]
C/C++ code#include<stdio.h>int a, arr[128];struct rec
{char ch;double dbl;
} Myrec;int main()
{int arr2[100];
printf("%d %d %d %d %d\n", __alignof__(a), __alignof__(arr), __alignof__(arr2), __alignof__(Myrec.ch), __alignof__(Myrec.dbl));return0;
}
输出:
4 4 4 1 4
其实根据编译结果,arr[128] 其实是 32 字节:
Assembly code .comm a,4,4
.comm arr,512,32
[/Quote]

明白了。多谢。
thy38 2009-09-12
  • 打赏
  • 举报
回复
学习
2009-09-12
  • 打赏
  • 举报
回复
#include <stdio.h>
int a, arr[128];
struct rec
{
char ch;
double dbl;
} Myrec;
int main()
{
int arr2[100];
printf("%d %d %d %d %d\n", __alignof__(a), __alignof__(arr), __alignof__(arr2), __alignof__(Myrec.ch), __alignof__(Myrec.dbl));
return 0;
}

输出:
4 4 4 1 4
其实根据编译结果,arr[128] 其实是 32 字节:
        .comm   a,4,4
.comm arr,512,32
井白人 2009-09-12
  • 打赏
  • 举报
回复
gcc >>>>>>..文盲中。。。
2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 aozhi 的回复:]
你说的这个我在VC和C++Builder上用过。
但是我只想查看,不想修改。
[/Quote]
试试 alignof()?
qiuhl_2003 2009-09-12
  • 打赏
  • 举报
回复
deng xia
guixunqing 2009-09-12
  • 打赏
  • 举报
回复
对齐,应该是与机器的位数有关系吧,32位的4字节对齐,64位的8字节对齐吧!
aozhi 2009-09-12
  • 打赏
  • 举报
回复
多谢
どうもありがとう
thank you very much
감사합니다
спасибо
merci
lijian22500 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 aozhi 的回复:]
引用http://www.linux.or.jp/JM/html/GNU_gcc/man1/gcc.1.html:
-fpcc-struct-return
函数返回struct和union值时,采用和本地编译器相同的参数约定.对于较小的结构, 这种约定的效率偏低,而且很多机器上不能重入;它的优点是允许GCC编译的目标码和PCC编译的目标码互相调用.

-freg-struct-return
一有可能就通过寄存器返回struct和union函数值.对于较小的结构,它比 -fpcc-struct-return更有效率.
如果既没有指定-fpcc-struct-return ,也没有指定-freg-struct-return, GNU CC默认使用目标机的标准约定.如果没有标准约定, GNU CC默认采用-fpcc-struct-return.



根据上面的内容,也就是说RedHatEnterPrise Linux AS(V4)的标准约定是8?
[/Quote]

このマニュアルに書かれた情報は GNU C コンパイラの完全なドキュメンテーションからの抜粋であり、オプションの意味の記述にとどめます。
このマニュアルはボランティアのメンテナンスが行なわれた時にのみ更新されるもので、常に最新の情報を示しているわけではありません。もしこのマニュアルと実際のソフトウェアの間に矛盾点があれば、正式なドキュメントである Info ファイルのほうを参照して下さい。

このマニュアル中の古い記述が重大な混乱や不具合をきたすことになれば、このマニュアルページの配布は中止します。 GNU CCのメンテナンス作業の都合上、 Info ファイルを更新した時にマニュアルページも併せて更新することはできません。マニュアルページは時代遅れであり、これに時間をかけるべきではないと GNU プロジェクトでは考えています。

完全な最新のドキュメンテーションが必要な場合は、Info ファイルの`gcc' またはマニュアルの Using and Porting GNU CC (for version 2.0) を参照して下さい。この双方は Texinfo のソースファイル gcc.texinfo から生成されます。
mLee79 2009-09-12
  • 打赏
  • 举报
回复
linux 下一般是4,win32 移植版 cygwin/mingw 啥的一般是8 。。。。

aozhi 2009-09-12
  • 打赏
  • 举报
回复
哪位还有什么高见?
aozhi 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jiayucunyan 的回复:]
一般地,可以通过下面的方法来改变缺省的对界条件:
· 使用伪指令#pragma pack (n),编译器将按照n 个字节对齐;
· 使用伪指令#pragma pack (),取消自定义字节对齐方式。
注意:如果#pragma pack (n)中指定的n 大于结构体中最大成员的size,则其不起作用,结构体
仍然按照size 最大的成员进行对界。

[/Quote]

你说的这个我在VC和C++Builder上用过。
但是我只想查看,不想修改。
jiayucunyan 2009-09-11
  • 打赏
  • 举报
回复
一般地,可以通过下面的方法来改变缺省的对界条件:
· 使用伪指令#pragma pack (n),编译器将按照n 个字节对齐;
· 使用伪指令#pragma pack (),取消自定义字节对齐方式。
注意:如果#pragma pack (n)中指定的n 大于结构体中最大成员的size,则其不起作用,结构体
仍然按照size 最大的成员进行对界。
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 aozhi 的回复:]
引用 4 楼 akirya 的回复:
引用 2 楼 aozhi 的回复:
引用http://www.linux.or.jp/JM/html/GNU_gcc/man1/gcc.1.html:
-fpcc-struct-return
函数返回struct和union值时,采用和本地编译器相同的参数约定.对于较小的结构, 这种约定的效率偏低,而且很多机器上不能重入;它的优点是允许GCC编译的目标码和PCC编译的目标码互相调用.

-freg-struct-return
一有可能就通过寄存器返回struct和union函数值.对于较小的结构,它比 -fpcc-struct-return更有效率.
如果既没有指定-fpcc-struct-return ,也没有指定-freg-struct-return, GNU CC默认使用目标机的标准约定.如果没有标准约定, GNU CC默认采用-fpcc-struct-return.


根据上面的内容,也就是说RedHatEnterPrise Linux AS(V4)的标准约定是8?

这个跟对齐没啥关系吧.


有空的话,能解释下吗?谢谢。
[/Quote]
没研究过这些编译选项
aozhi 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 akirya 的回复:]
引用 2 楼 aozhi 的回复:
引用http://www.linux.or.jp/JM/html/GNU_gcc/man1/gcc.1.html:
-fpcc-struct-return
函数返回struct和union值时,采用和本地编译器相同的参数约定.对于较小的结构, 这种约定的效率偏低,而且很多机器上不能重入;它的优点是允许GCC编译的目标码和PCC编译的目标码互相调用.

-freg-struct-return
一有可能就通过寄存器返回struct和union函数值.对于较小的结构,它比 -fpcc-struct-return更有效率.
如果既没有指定-fpcc-struct-return ,也没有指定-freg-struct-return, GNU CC默认使用目标机的标准约定.如果没有标准约定, GNU CC默认采用-fpcc-struct-return.


根据上面的内容,也就是说RedHatEnterPrise Linux AS(V4)的标准约定是8?

这个跟对齐没啥关系吧.
[/Quote]

有空的话,能解释下吗?谢谢。
  • 打赏
  • 举报
回复
`-malign-double'
`-mno-align-double'
Control whether GCC aligns `double', `long double', and `long
long' variables on a two word boundary or a one word boundary.
Aligning `double' variables on a two word boundary will produce
code that runs somewhat faster on a `Pentium' at the expense of
more memory.

On x86-64, `-malign-double' is enabled by default.

*Warning:* if you use the `-malign-double' switch, structures
containing the above types will be aligned differently than the
published application binary interface specifications for the 386
and will not be binary compatible with structures in code compiled
without that switch.
2009-09-11
  • 打赏
  • 举报
回复
指令对齐我看过 16 的(打开优化),全局数组也有 32 的,局部的东西不太清楚。
加载更多回复(4)

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧