我想知道是否可以在 C 中“減少”資料型別的對齊。例如 的對齊方式int為 4;我想知道是否可以將對齊設定int為 1 或 2。我嘗試使用alignas關鍵字,但它似乎不起作用。
我想知道這是我的編譯器沒有完成的事情,還是 C 標準不允許這樣做;無論哪種情況,我都想知道為什么會這樣。
uj5u.com熱心網友回復:
我想知道是否可以在 C 中“減少”資料型別的對齊。
這不可能。從這個 C 標準草案:
10.6.2 對齊說明符 [dcl.align]
...
5宣告中所有對齊說明符 的組合效果 不應指定比如果省略了與該物體相關的所有對齊說明符所宣告的物體所需的對齊方式更嚴格的對齊方式。
這樣做的“原因”是,在大多數情況下,對齊要求是由目標硬體決定的:如果給定的 CPU要求將inta 存盤在 4 位元組對齊的地址中,那么,如果允許編譯器生成將這樣的代碼放在int不太嚴格對齊的記憶體位置的代碼,程式在運行時會導致硬體故障。(請注意,在某些平臺上,an的對齊要求int僅為 1 個位元組,即使在更嚴格對齊時可能會優化訪問。)
一些編譯器可能會提供似乎允許減少對齊的方法;例如,MSVC 有__declspec(align(#))擴展,可以在typedef陳述句中應用。但是,從檔案中:__declspec(align(#))只能增加對齊限制:
#include <iostream>
typedef __declspec(align(1)) int MyInt; // No compiler error, but...
int main()
{
std::cout << alignof(int) << "\n"; // "4"
std::cout << alignof(MyInt) << "\n"; // "4" ...doesn't reduce the aligment requirement
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/455162.html
