2009-08-31 58 views
0

我理解的结构比为“实施具体的”,只是不知道是否有任何简单的方法来计算结构比对,例如:有没有简单的方法(宏?)来告诉结构对齐?

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

是上述的前提下可靠地真的吗?

回答

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

的#include 结构虚设 { 炭X; int i; }; size_t test_alignment = offsetof(struct dummy,i); 以上工作? –

+0

取决于“作品”的含义。它将test_alignment设置为'struct dummy'里面'i'的对齐方式。如果这就是你想要它做的,那么它肯定会奏效。 –

+0

这将测试'int'类型的对齐(我假设你想测试定义的类型'test'的对齐?) – caf

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(),如果它检测到支持它的编译器(尽管我真的不知道内在提供了什么优点),那么它会使用它。

+0

如果我没有弄错,你的宏有未定义的行为,因为'offsetof'不需要对匿名结构的工作就像那样的争论一样传递。你可以通过在宏体中自己写出'offsetof'的可移植定义来修复它。 –

相关问题