我知道结构中的内存对齐方式,但我对我正在处理的项目中遇到的这种实现感到困惑。
struct default {
uint8_t variable[((sizeof(struct dummyStructure) + 3) /4)*4] // Align on 32 bit boundary
}
此刻更像是一个黑盒测试,因为我无法访问这些功能,但任何人都可以解释这里使用的数学运算来实现这种对齐。
答案 0 :(得分:1)
你可以分解它:
uint8_t variable[((sizeof(struct dummyStructure) + 3) /4)*4]
您有两种情况 - sizeof dummyStructure
可以均匀分割为4或不是。
示例:
(sizeof(struct dummyStructure) = 12
(12 + 3) / 4 = 15 / 4 = 3
3 * 4 = 12
所以返回原始尺寸
(sizeof(struct dummyStructure) = 13
(13 + 3) / 4 = 16 / 4 = 4
4 * 4 = 16
所以返回下一个大小均匀分割为4
(sizeof(struct dummyStructure) = 15
(15 + 3) / 4 = 18 / 4 = 4
4 * 4 = 16
如上所述
(sizeof(struct dummyStructure) = 16
(16 + 3) / 4 = 19 / 4 = 4
4 * 4 = 16
所以再次返回原始尺寸
(sizeof(struct dummyStructure) = 17
(17 + 3) / 4 = 20 / 4 = 5
5 * 4 = 20
所以返回下一个大小均匀分割为4
实际上这段代码没有在32位地址对齐变量!它只在数组中分配足够的空间以允许手动将dummyStructure置于其中。 这个解决方案非常糟糕。
恕我直言更好的解决方案(当然取决于代码中发生的事情):
1)因为C11
struct defaultx
{
alignas(4) int variable[sizeof(struct dummyStructure)];
};
2)gcc或clang特定
struct defaultx
{
int variable[sizeof(struct dummyStructure)];
} __attribute__((aligned(4)));
将确保变量与4个字节对齐;
答案 1 :(得分:1)
你的问题的答案是,通过在dummyStructure的大小上加3,并将除法结果的整数部分乘以4乘以4,你将得到:
因此它总是会产生一个4字节的可分数(32位对齐)。
示例:
如果dummyStructure的大小是8个字节,则结果为((8 + 3)/ 4)* 4 = 8.
现在,如果dummyStructure的大小为11,则结果为((11 + 3)/ 4)* 4 = 12.
我只是想知道为什么开发人员决定这样做,因为dummyStructure应该始终根据处理器架构进行对齐。