【发布时间】:2010-03-26 00:30:10
【问题描述】:
有没有办法使用 GNUism 强制对齐结构的特定元素?
【问题讨论】:
有没有办法使用 GNUism 强制对齐结构的特定元素?
【问题讨论】:
试试6.54.8 Structure-Packing Pragmas
为了与微软兼容 Windows 编译器,GCC 支持一套 的 #pragma 指令改变了 成员的最大对齐 结构(除了零宽度 位域)、联合和类 随后定义。 n 值 下面总是需要一个小的 2 的幂并指定新的 以字节为单位对齐。
#pragma pack(n)只是设置新的对齐方式。#pragma pack()将对齐设置为 编译开始时的效果(参见 还有命令行选项-fpack-struct[=<n>]参见代码生成选项)。#pragma pack(push[,n])将当前对齐设置推送到 内部堆栈,然后可选 设置新的对齐方式。#pragma pack(pop)将对齐设置恢复为保存在 内部堆栈的顶部(和 删除该堆栈条目)。注意#pragma pack([n])不影响这个内部堆栈;因此它是 可能有#pragma pack(push)后跟多个#pragma pack(n)实例并由单个完成#pragma pack(pop)。一些目标,例如i386和powerpc, 支持
ms_struct#pragma哪个 布置一个结构作为记录__attribute__ ((ms_struct)).
#pragma ms_struct on打开声明结构的布局。#pragma ms_struct off关闭声明结构的布局。#pragma ms_struct reset回到默认布局。
【讨论】:
http://gcc.gnu.org/onlinedocs/gcc-3.1.1/gcc/Type-Attributes.html
aligned (alignment)
This attribute specifies a minimum alignment (in bytes) for variables of the specified type. > For example, the declarations:
struct S { short f[3]; } __attribute__ ((aligned (8)));
typedef int more_aligned_int __attribute__ ((aligned (8)));
【讨论】:
你可以试试在结构上对齐的属性:
__attribute__((__aligned__(8)))
【讨论】:
除了列出的内容之外,您可能还对 attribute((packed)) 感兴趣,它尝试在没有任何填充的情况下布置数据 - 基本上将对齐设置为 1。 这在描述文件或网络协议中的数据布局时非常有用,其中填充字节应该刚刚消失。
【讨论】: