2009-08-31 94 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'的可移植定義來修復它。 –

相關問題