【问题标题】:How much memory does alignment use in C?在 C 中对齐使用多少内存?
【发布时间】:2018-11-21 18:13:44
【问题描述】:

我有这个程序:

__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)”

【问题讨论】:

  • 哼,你觉得还能在哪里?
  • 我有一个具有 1MB 可用 RAM 的嵌入式系统,FLASH_SECTOR_SIZE 是 65536。所以这应该占用整个内存。他们给了我这样的代码,老实说,我想知道和你一样的事情。
  • 我猜这是故意的,内存肯定是后面手动处理的。这可能是因为您无法访问标准的 malloc/free(我的猜测)
  • 嗯,我确实在代码中看到了 1 个 malloc() 调用
  • 显然这里没有,但我想这只是一个演示样本......也就是说我只是想猜测,董事会必须有一些文档,您可能会查看以获得准确的信息.

标签: c memory embedded


【解决方案1】:

没有。 __attribute__((aligned(16))) 只是确保 FLASH_BUFFER2 放在 16 字节的边界上。它仍将保留FLASH_SECTOR_SIZE * sizeof(uint16_t) 字节。

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

【讨论】:

  • 它确实是用来写FLASH的,我想了同样的原因
【解决方案2】:

当我运行它时,它会在内存中保留 FLASH_SECTOR_SIZE * 16 字节吗?

没有。类型 uint16_t 是 16 bits 宽,而不是 16 bytes。内存确实是为数组保留的,但它的大小是FLASH_SECTOR_SIZE * 2 字节。

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

【讨论】:

    猜你喜欢
    • 2010-09-30
    • 2011-11-27
    • 2015-09-24
    • 2017-06-02
    • 2010-09-08
    • 1970-01-01
    • 2012-11-13
    • 2018-07-22
    • 1970-01-01
    相关资源
    最近更新 更多