全局/局部變量在C如果我創建像將由128位邊界對齊這種類型的內存對齊在C
typedef struct A
{
int a;
char b;
} sampleType __attribute__ ((aligned (128)));
所有變量的結構。
這種類型的全局和局部變量是否一樣? 或者它不同於編譯器和編譯器? GCC/LLVM如何處理它們?
全局/局部變量在C如果我創建像將由128位邊界對齊這種類型的內存對齊在C
typedef struct A
{
int a;
char b;
} sampleType __attribute__ ((aligned (128)));
所有變量的結構。
這種類型的全局和局部變量是否一樣? 或者它不同於編譯器和編譯器? GCC/LLVM如何處理它們?
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
得到別人面前地址...
有一件事是清楚的 - 僅使用sampleType
的typedef將強制使用指定的對齊變量。
使用struct A
聲明的變量不會。
這個語法是GCC擴展 - 其他編譯器可能會也可能不支持它(MSVC不會,我不知道LLVM是否會)。
請注意,__屬性__是GCC特定的內容。此外,並不保證對齊 - 不同的平臺可能有基於所涉及的鏈接器的上限。 – Joe
Micheal在他的回答中提到,涉及兩種類型。 'struct A'和'sampleType'別名的類型。這兩種類型不一樣,'__attribute__'只適用於後者。 AFAIR你可以把'__attribute__'放在'struct'之前應用到那裏。無論如何,我發現將這兩個聲明分開的情況會更加清晰。我會先放一個簡單的'typedef struct A sampleType'。 –