C语言中对齐使用多少内存?

时间:2018-11-21 18:13:44

标签: c memory embedded

我有这个程序:

__attribute__((section(".graph"))) __attribute__((aligned(16)))
uint16_t FLASH_BUFFER2[FLASH_SECTOR_SIZE];

int main ()
{
  printf("Hallo World"\n);
}

当我运行它时,它是否在内存中保留FLASH_SECTOR_SIZE * 16个字节?

编辑:技术上正确的问题是“它是否在内存中保留FLASH_SECTOR_SIZE * 2 * 16个字节?(uint16_t是2个字节,对齐是16个字节)”

2 个答案:

答案 0 :(得分:4)

不。 __attribute__((aligned(16)))仅确保将FLASH_BUFFER2放在16字节的边界上。它仍然会保留FLASH_SECTOR_SIZE * sizeof(uint16_t)个字节。

当我过去使用该属性时,是因为DMA控制器或用于向内部闪存写入数据或从内部闪存写入数据的机制要求RAM位置在16字节边界上。因为您是在嵌入式系统上执行此操作的,所以您可能会处理同一件事。

答案 1 :(得分:2)

  

当我运行它时,它是否在内存中保留FLASH_SECTOR_SIZE * 16个字节?

不。类型uint16_t的宽度为16个,而不是16个字节。内存确实是为数组保留的,但其大小为FLASH_SECTOR_SIZE * 2字节。

您提供的__attribute__语法不是标准C的一部分,所以它的含义取决于您的编译器,但是我认为没有理由认为它使数组实际上并没有为其保留任何内存,或更改保留的内存量。 __attribute__((aligned(16)))可能只是确保数组的起始地址在16字节边界上对齐。