【问题标题】:What is pragma align in C?什么是 C 中的编译指示对齐?
【发布时间】:2012-11-29 08:11:41
【问题描述】:

最近在查看代码时,我发现#pragma DATA_ALIGN(var, 4*1024)。 var 是一个大约 20k 长的结构变量。我在互联网上搜索了这个,找不到任何有用的东西。谁能提供我的链接或对此有所了解?

【问题讨论】:

  • 一般#pragma 是特定于编译器的,您应该至少包含一些有关所用编译器的信息。

标签: c memory-management operating-system


【解决方案1】:

这意味着var 结构将是页面对齐的(大多数计算机体系结构中的标准页面大小为 4K=4096 字节),即它将存储在地址可被 4096 整除的位置。这种方法提高了性能,因为操作系统通过执行称为page fault 的操作从磁盘(即paged memory)获取与页面大小相等的块中的数据。每个page fault 都是处理器和 I/O 系统的附加工作。最小化page faults 的数量是提高性能的重要手段。如果数据不是页面对齐的,访问它可能需要一个额外的page fault,而只需要一部分带来的数据。

编辑: 尽管在大多数情况下对齐到 4K 是由于内存管理,但可能还有其他对齐原因,主要是硬件限制 - 正如 @CodePainters 正确指出的那样。

【讨论】:

  • 虽然您很可能是对的,但您并不了解目标系统和应用程序——这种对齐的原因也可能完全不同(例如嵌入式系统上的 DMA 控制器要求)芯片)。
【解决方案2】:

#pragma 指令为每个编译器提供了一种方法来提供特定于机器和操作系统的功能,同时保持与 C 和 C++ 语言的整体兼容性。根据定义,编译指示是特定于机器或操作系统的,并且通常对于每个编译器都不同。

我认为http://www.songho.ca/misc/alignment/dataalign.html 将有助于理解数据对齐。 &正如你所说的 var 是一个大小约为 20k 的结构,那么分配给这个结构的内存将被对齐为页面对齐 &@icepack 的答案已经解释了。

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 2014-01-12
    • 1970-01-01
    • 2017-08-19
    • 2011-05-18
    • 2015-04-12
    • 2012-09-12
    • 2022-01-23
    • 2021-01-18
    相关资源
    最近更新 更多