调整结构中的内存对齐

时间:2017-03-16 19:15:50

标签: c struct memory-alignment

我知道结构中的内存对齐方式,但我对我正在处理的项目中遇到的这种实现感到困惑。

struct default {
     uint8_t variable[((sizeof(struct dummyStructure) + 3) /4)*4]  // Align on 32 bit boundary
}

此刻更像是一个黑盒测试,因为我无法访问这些功能,但任何人都可以解释这里使用的数学运算来实现这种对齐。

2 个答案:

答案 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,你将得到:

  1. dummyStructure的确切大小,如果它与32位(或其任何倍数,如64位)对齐。
  2. 或者比dummyStructure的大小大32位的第一个倍数。
  3. 因此它总是会产生一个4字节的可分数(32位对齐)。

    示例:

    如果dummyStructure的大小是8个字节,则结果为((8 + 3)/ 4)* 4 = 8.

    现在,如果dummyStructure的大小为11,则结果为((11 + 3)/ 4)* 4 = 12.

    我只是想知道为什么开发人员决定这样做,因为dummyStructure应该始终根据处理器架构进行对齐。