2011-07-22 67 views
7

對不起,有一個愚蠢的問題,但是如果我需要確保結構/類/聯合的對齊,我應該添加屬性((aligned(align) ))來typedef聲明?GCC中的結構對齊(應該在typedef中指定對齊方式嗎?)

class myAlignedStruct{} __attribute__ ((aligned(16))); 
typedef myAlignedStruct myAlignedStruct2; // Will myAlignedStruct2 be aligned by 16 bytes or not? 
+1

絕對不是一個愚蠢的問題。我認爲myAlignedStruct2的排列方式與myAlignedStruct相同,但希望能夠確定。您是否嘗試過使用printf(「尺寸:%d,%d」,sizeof(myAlignedStruct),sizeof(myAlignedStruct2)); ? – Shlublu

+0

@Shlublu:'sizeof'檢查包裝,但對齊不同!沒有標準的運算符,但是GCC提供'__alignof __()',如我的答案所示。 –

+0

啊,對不起,我混了!這使你的問題更加有趣! – Shlublu

回答

8

應該怎麼加屬性((對齊(對齊)))以typedef聲明?

沒有......的typedef只是假名或別名指定的實際類型,他們不存在,作爲一個獨立的類型有不同的定位,包裝等。

#include <iostream> 

struct Default_Alignment 
{ 
    char c; 
}; 

struct Align16 
{ 
    char c; 
} __attribute__ ((aligned(16))); 

typedef Align16 Also_Align16; 

int main() 
{ 
    std::cout << __alignof__(Default_Alignment) << '\n'; 
    std::cout << __alignof__(Align16) << '\n'; 
    std::cout << __alignof__(Also_Align16) << '\n'; 
} 

輸出:

1 
16 
16 
+0

有點困惑,你的意思是說,myAlignedStruct2是由16字節對齊? –

+0

@Als:我的意思是「我應該添加屬性((對齊(對齊))到typedef聲明?」:否。是的,「myAlignedStruct2 [將]以16字節對齊」。上面添加了說明性代碼和輸出.... –

+0

我的+1。這是正確的。有兩個Q和明確提及是和否,現在每個都說得很清楚。 :) –

6

接受的答案(「否」)是正確的,但我想澄清一個可能誤導的部分。我會添加評論,但需要格式化一些代碼;因此是新的答案。

的typedef只是假名或別名中指定的實際類型,它們不存在作爲單獨的類型具有不同的取向,包裝等。

這是不正確的,至少GCC (OP的編譯器)和GHS。例如,以下編譯沒有錯誤,表明對齊可以將附加到typedef。

不正確的對齊(大於對象的大小)僅僅是爲了震撼和娛樂價值。

#define CASSERT(expr) { typedef char cassert_type[(expr) ? 1 : -1]; } 

typedef __attribute__((aligned(64))) uint8_t aligned_uint8_t; 

typedef struct 
{ 
    aligned_uint8_t t; 
} contains_aligned_char_t; 

void check_aligned_char_semantics() 
{ 
    CASSERT(__alignof(aligned_uint8_t) == 64); 
    CASSERT(sizeof(aligned_uint8_t) == 1); 
    CASSERT(sizeof(contains_aligned_char_t) == 64); 
}