我最近在我的应用程序中遇到了我认为是错误共享的问题,我查了一下关于如何将我的数据与缓存行对齐。他建议使用以下 C++ 代码:
// C++ (using C++0x alignment syntax)
template<typename T>
struct cache_line_storage {
[[ align(CACHE_LINE_SIZE) ]] T data;
char pad[ CACHE_LINE_SIZE > sizeof(T)
? CACHE_LINE_SIZE - sizeof(T)
: 1 ];
};
我可以看到这是如何工作的CACHE_LINE_SIZE > sizeof(T)
是 true -- 结构体cache_line_storage
最终会占用一整行内存缓存。然而,当sizeof(T)
大于单个缓存行,我认为我们应该通过以下方式填充数据CACHE_LINE_SIZE - T % CACHE_LINE_SIZE
字节,因此生成的结构体的大小是缓存行大小的整数倍。我的理解有什么问题吗?为什么填充 1 个字节就足够了?
数组的大小不能为 0,因此需要 1 才能编译。然而,当前的规范草案版本表示这种填充是不必要的;编译器必须填充结构的对齐方式。
另请注意,如果以下情况,此代码是错误的:CACHE_LINE_SIZE
小于alignof(T)
。要解决这个问题,您可能应该使用[[align(CACHE_LINE_SIZE), align(T)]]
,这将确保永远不会选择较小的对齐方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)