如何获得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/