【问题标题】:How can I align an element of a struct?如何对齐结构的元素?
【发布时间】:2010-03-26 00:30:10
【问题描述】:

有没有办法使用 GNUism 强制对齐结构的特定元素?

【问题讨论】:

    标签: c struct alignment


    【解决方案1】:

    试试6.54.8 Structure-Packing Pragmas

    为了与微软兼容 Windows 编译器,GCC 支持一套 的 #pragma 指令改变了 成员的最大对齐 结构(除了零宽度 位域)、联合和类 随后定义。 n 值 下面总是需要一个小的 2 的幂并指定新的 以字节为单位对齐。

    1. #pragma pack(n) 只是设置新的对齐方式。
    2. #pragma pack() 将对齐设置为 编译开始时的效果(参见 还有命令行选项 -fpack-struct[=<n>] 参见代码生成选项)。
    3. #pragma pack(push[,n]) 将当前对齐设置推送到 内部堆栈,然后可选 设置新的对齐方式。
    4. #pragma pack(pop) 将对齐设置恢复为保存在 内部堆栈的顶部(和 删除该堆栈条目)。注意 #pragma pack([n]) 不影响这个内部堆栈;因此它是 可能有#pragma pack(push) 后跟多个#pragma pack(n) 实例并由单个完成 #pragma pack(pop)

    一些目标,例如i386和powerpc, 支持ms_struct#pragma哪个 布置一个结构作为记录 __attribute__ ((ms_struct)).

    1. #pragma ms_struct on 打开声明结构的布局。
    2. #pragma ms_struct off 关闭声明结构的布局。
    3. #pragma ms_struct reset 回到默认布局。

    【讨论】:

      【解决方案2】:

      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)));
      

      【讨论】:

        【解决方案3】:

        你可以试试在结构上对齐的属性:

        __attribute__((__aligned__(8)))
        

        【讨论】:

          【解决方案4】:

          除了列出的内容之外,您可能还对 attribute((packed)) 感兴趣,它尝试在没有任何填充的情况下布置数据 - 基本上将对齐设置为 1。 这在描述文件或网络协议中的数据布局时非常有用,其中填充字节应该刚刚消失。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-11-26
            • 2021-01-03
            • 2015-05-24
            • 2021-11-16
            • 1970-01-01
            • 1970-01-01
            • 2011-12-03
            相关资源
            最近更新 更多