c - 获取处理器的内存粒度

标签 c memory-management memory-alignment granularity

如何获得memory granularity在 C 中的 CPU?

假设我想分配一个数组,其中所有元素都正确内存对齐。我可以将每个元素填充到特定大小 N 来实现这一点。我怎么知道N的值?

备注 :我正在尝试创建一个内存池,其中每个插槽都是内存对齐的。任何建议将不胜感激。

最佳答案

理论上

How to get the memory granularity of a CPU in C?


首先,您阅读指令集架构手册。它可能指定某些指令需要某些对齐,甚至某些指令中的寻址形式不能表示未对齐的地址。它可以指定有关对齐的其他属性。
其次,您阅读处理器手册。它可以指定性能特征(例如支持未对齐的加载或存储,但可能比对齐的加载或存储慢或使用更多资源),并且可以指定指令集架构允许的各种选项。
第三,您阅读操作系统文档。某些体系结构允许操作系统选择与对齐相关的功能,例如是否使未对齐的加载和存储失败或受到支持,尽管其性能比对齐的加载或存储慢。操作系统文档应该有这个信息。
在实践中
对于许多编程情况,您需要了解的不是 CPU 的“内存粒度”,而是您正在使用的 C 实现(或您正在使用的任何语言)的对齐要求。而且,在大多数情况下,您不需要直接了解对齐要求,而只需要遵循有关管理对象的语言规则——使用具有声明类型的对象,不要使用强制类型转换在不兼容类型之间转换指针超出特定规则允许的范围它,使用由 malloc 提供的适当对齐的内存而不是调整你自己的字节指针,等等。遵循这些规则将为程序中的对象提供良好的对齐。
在 C 中,当您定义一个数组时,元素大小将自动成为 C 实现对其对齐所需的大小。例如,long double x[100];即使硬件仅使用 10 个字节用于 long double,每个数组元素也可以使用 16 个字节。 .或者,对于任何 struct foo您定义的,编译器将根据需要自动在结构中包含填充以提供所需的对齐方式,以及任何数组 struct foo x[100];将已经包含该填充。 sizeof(struct foo)将与 sizeof x[0] 相同,因为每个结构对象都有内置的填充,即使只是针对单个结构对象,而不仅仅是针对数组中的元素。
当您确实需要知道 C 实现对类型所需的对齐方式时,您可以使用 C 的 _Alignof运算符(operator)。表达式 _Alignof(type)提供 type 所需的对齐方式.
其他

… properly memory aligned.


正确对齐是度数问题:
  • 处理器支持的内容可能会决定您的程序是否有效。不正确的对齐会导致您的程序陷入困境。
  • 单个加载和存储的效率可能会影响程序运行的速度。不正确的对齐会导致您的程序执行得更慢。
  • 在某些对性能至关重要的情况下,缓存和内存映射功能的对齐也会影响性能。
  • 关于c - 获取处理器的内存粒度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62245856/

    相关文章:

    创建/分配 p_threads 数组

    c - 在 C 中,char 数组和 string 数组在 c 中显示不同的大小,但比较时它们是相同的

    iphone - 如何处理对象警告的潜在泄漏 - CLLocationManager

    c - 变量点等于数组中的元素

    c - 将数据从 iphdr 传递到结构

    c++ - 异常安全构造函数

    C - 释放动态分配的结构数组得到 'Invalid next size (fast)' 错误

    C 未定义的行为。严格的别名规则,还是不正确的对齐方式?

    ARM 上的 C++ 结构成员对齐和打包要求

    delphi - 如何在 Delphi 汇编器中将短条件跳转与分支目标对齐与 `.align` 协调起来?