【问题标题】:is there a simple way (macro?) to tell structure alignment?有没有一种简单的方法(宏?)来告诉结构对齐?
【发布时间】:2009-09-01 01:31:01
【问题描述】:

我了解结构对齐是“特定于实现”,但只是想知道是否有任何简单的方法来计算结构对齐,例如:

typedef struct
{
    char c;
    int  i;
} test;

if sizeof(test) - (sizeof(char) + sizeof(int)) == 0 means alignment is  1 byte;
if sizeof(test) - (sizeof(char) + sizeof(int)) == 1 means alignment is  2 bytes;
// ...etc...

上述假设可靠吗?

【问题讨论】:

    标签: c alignment


    【解决方案1】:

    您的方法在一般情况下不可靠:如果您在此结构上尝试过:

    typedef struct
    {
        int i1;
        int i2;
    } test;
    

    它会给你零作为结果,这可能不是对齐。

    下面是一个可行的方法:

    #include <stddef.h>
    
    struct dummy
    {
        char x;
        test t;
    };
    
    size_t test_alignment = offsetof(struct dummy, t);
    

    【讨论】:

    • #include struct dummy { char x;诠释我; }; size_t test_alignment = offsetof(struct dummy, i);以上工作吗?
    • 取决于您所说的“作品”。它将 test_alignment 设置为 istruct dummy 内的对齐方式。如果这就是您希望它做的事情,那么它肯定会起作用。
    • 这将测试int 类型的对齐方式(我假设您想测试已定义类型test 的对齐方式?)
    【解决方案2】:

    这是我工具箱中的宏(使用caf's technique)来获得类型的对齐:

    #define ALIGNMENT_OF(t) offsetof( struct { char x; t dummy; }, dummy)
    

    所以现在你可以使用这样的表达方式:

    typedef struct
    {
        char c;
        int  i;
    } test;
    
    size_t x = ALIGNMENT_OF( test);    // will likely set x = 4
    

    请注意,特定编译器可能支持您可能更喜欢使用的非标准内在函数(例如,MSVC 在某些时候开始支持 __alignof() 内在函数)。我的标头在检测到支持它的编译器时使用该内在函数定义 ALIGNMENT_OF()(尽管老实说我不知道​​内在函数提供了什么优势)。

    【讨论】:

    • 如果我没记错的话,你的宏有未定义的行为,因为offsetof 不需要处理像这样作为参数传递的匿名结构。您可以通过在宏正文中自己写出offsetof 的可移植定义来修复它。
    【解决方案3】:

    如果你想要的只是一个好的第一个猜测,然后传递找到结构和任何嵌套结构中最大的非聚合成员的最大大小

    【讨论】:

      猜你喜欢
      • 2016-08-30
      • 1970-01-01
      • 2013-06-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多