あなたはそれを分解することができます
uint8_t variable[((sizeof(struct dummyStructure) + 3) /4)*4]
をあなたが持っている2例 - sizeof dummyStructure
は4かないで均等に分割可能です。
例:
(sizeof(struct dummyStructure) = 12
(12 + 3)/4 = 15/4 = 3
3 * 4 = 12
そこそこ
(sizeof(struct dummyStructure) = 16
(16 + 3)/4 = 19/4 = 4
4 * 4 = 16
上記のように4
(sizeof(struct dummyStructure) = 15
(15 + 3)/4 = 18/4 = 4
4 * 4 = 16
によって均等に分割可能な次のサイズを返す
(sizeof(struct dummyStructure) = 13
(13 + 3)/4 = 16/4 = 4
4 * 4 = 16
元のサイズを返します
ように原稿サイズが
(sizeof(struct dummyStructure) = 17
(17 + 3)/4 = 20/4 = 5
5 * 4 = 20
再び戻るので、このコードは、32ビットのアドレスに変数を整列しない現実で4
によって均等に分割可能な次のサイズを返します!ダミー構造体を手動で配置することができるように、配列内に十分な領域を割り当てます。 このソリューションは本当に悪いです。
IMHO、より良いソリューション(もちろん、コードで何が起こるかによって異なります):
1)C11
struct defaultx
{
alignas(4) int variable[sizeof(struct dummyStructure)];
};
2)のgccや打ち鳴らすので、特定の
struct defaultx
{
int variable[sizeof(struct dummyStructure)];
} __attribute__((aligned(4)));
は、変数があることを確認します4バイトにアライメントされます。
この構造体には32ビット境界があると思いますか? uint8_tデータ型は1バイトのアラインメントを持ちます。配列も1バイトの配列になります。サイズにかかわらず。構造体と同じです。プラットフォーム上で私はそれが1バイトのアライメントを持っていることを知っています –