2011-08-25 56 views
1

全局/局部變量在C如果我創建像將由128位邊界對齊這種類型的內存對齊在C

typedef struct A 
{ 
    int a; 
    char b; 
} sampleType __attribute__ ((aligned (128))); 

所有變量的結構。

這種類型的全局和局部變量是否一樣? 或者它不同於編譯器和編譯器? GCC/LLVM如何處理它們?

+2

請注意,__屬性__是GCC特定的內容。此外,並不保證對齊 - 不同的平臺可能有基於所涉及的鏈接器的上限。 – Joe

+1

Micheal在他的回答中提到,涉及兩種類型。 'struct A'和'sampleType'別名的類型。這兩種類型不一樣,'__attribute__'只適用於後者。 AFAIR你可以把'__attribute__'放在'struct'之前應用到那裏。無論如何,我發現將這兩個聲明分開的情況會更加清晰。我會先放一個簡單的'typedef struct A sampleType'。 –

回答

1

AFAIK __attribute__是高度依賴於編譯器的。與海灣合作委員會,這個計劃

#include <stdio.h> 

typedef struct st 
{ 
    int a; 
    char b; 
} st __attribute__ ((aligned (128))); 

static char a; 
static st b; 
static char c; 
static struct st d; 

char e; 
st f; 
char g; 
struct st h; 

int main() 
{ 
    char i; 
    st j; 
    char k; 
    struct st l; 

    printf("%p %p %p %p\n", &a, &b, &c, &d); 
    printf("%p %p %p %p\n", &e, &f, &g, &h); 
    printf("%p %p %p %p\n", &i, &j, &k, &l); 
} 

給我

0x804a100 0x804a180 0x804a188 0x804a18c 
0x804a208 0x804a280 0x804a288 0x804a200 
0xbfc8d87f 0xbfc8d800 0xbfc8d7ff 0xbfc8d7f4 

這說明什麼?

如果真的使用typedef ed類型(st),則會發生對齊。如果我使用struct st,它不會。

如果發生這種情況,它會發生在static變量上,在external鏈接上以及在automatic上(在堆棧上)。

什麼讓我困惑的是,h得到別人面前地址...

2

有一件事是清楚的 - 僅使用sampleType的typedef將強制使用指定的對齊變量。

使用struct A聲明的變量不會。

這個語法是GCC擴展 - 其他編譯器可能會也可能不支持它(MSVC不會,我不知道LLVM是否會)。