是否有一种简单的方法(宏?)来告诉结构对齐?

时间:2009-08-31 00:18:46

标签: c alignment

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

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...

上述假设是否可靠?

3 个答案:

答案 0 :(得分:4)

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

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

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

这是一种有效的方法:

#include <stddef.h>

struct dummy
{
    char x;
    test t;
};

size_t test_alignment = offsetof(struct dummy, t);

答案 1 :(得分:1)

这是我在工具箱中使用的宏(使用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(),如果它检测到支持它的编译器(尽管我真的不知道内在函数提供了什么优势)。

答案 2 :(得分:0)

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