我最初是從我的平板電腦寫下這個問題的,並採取了很多快捷方式,因此我認爲最終會導致讀者和/或試圖回答問題的人感到困惑。爲什麼這個alignment屬性必須在typedef中指定?
我不是要求解決我最初開始的問題。如果你真的想要後面的故事閱讀下一段,否則跳過它。
帶來的是一些舊代碼在{struct, data, struct, data, ...}
的數據陣列上運行,其中每個data
具有任意長度。代碼通過指針訪問每個結構,當我們切換到gcc時,由於訪問錯誤,它在Solaris中開始崩潰。解決這個問題的一個想法是改變類型的對齊方式,如下所示,但我可能不打算這樣做。
要回答的問題可以概括爲:
- 的文檔狀態對準不能與
aligned
下降,但我可以用一個typedef來做到這一點。它按預期工作嗎? - 如果它按預期工作,爲什麼它需要typedef?爲什麼我不能降低對齊作爲結構定義的一部分?
- 注:它可以與
typedef struct {...}__attribute__((aligned(1))) Typename;
完成以及
- 注:它可以與
這裏有一個link to some sample code running on wandbox。在情況下,鏈接去死:
#include <cstdio>
#include <assert.h>
#define ALIGN __attribute__((aligned(1)))
struct Misaligned_1_t { int x; double y; float z; };
struct ALIGN Misaligned_2_t { int x; double y; float z; };
struct Misaligned_3_t { int x; double y; float z; } ALIGN;
// The gcc documentation indicates that the "aligned" attribute
// can only be used to increase alignment, so I was surprised
// to discover this actually works. Why does it work?
typedef Misaligned_1_t ALIGN Aligned_t;
int main(int, char**) {
char buffer[256];
// The following is meant to simulate a more complicated scenario:
// {SomeStruct, char[arbitrary length], SomeStruct, char[arbitrary length], ...}
// ... where accessing, using and changing each SomeStruct will result in
// misaligned accesses.
auto *m1 = (Misaligned_1_t*)&buffer[1];
auto *m2 = (Misaligned_1_t*)&buffer[1];
auto *m3 = (Misaligned_1_t*)&buffer[1];
auto *a1 = (Aligned_t*)&buffer[1];
// The documentation says we can only reduce alignment with the "packed" attribute,
// but that would change the size/layout of the structs. This is to demonstrate
// that each type is the same size (and should have the same layout).
assert( sizeof(m1) == sizeof(m2)
&& sizeof(m1) == sizeof(m3)
&& sizeof(m1) == sizeof(a1));
m1->y = 3.14159265358979323846264; // misaligned access
std::printf("%0.16f\n", m2->y); // misaligned access
std::printf("%0.16f\n", m3->y); // misaligned access
std::printf("%0.16f\n", a1->y); // works fine
return 0;
}
*「爲什麼這個alignment屬性必須在typedef中指定?」*與什麼相反?什麼是實際問題? – user694733
爲什麼不'struct __attribute __((aligned(1)))Test {...}'工作?我閱讀文檔給我的印象是,如果沒有'packed',我不應該降低這種對齊方式,但是因爲它似乎工作,我很好奇爲什麼它不工作沒有typedef –
對齊(1)說將結構與1個字節對齊?我不認爲這有什麼影響。你期望什麼效果? – dbrank0