我最近在我的应用程序中遇到了一个我认为是虚假共享的问题,我查询了Sutter的文章关于如何将我的数据对齐到缓存行。他建议使用以下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)
时的情况,结构体cache_line_storage
会占据一个完整的缓存行内存。然而,当sizeof(T)
大于一个缓存行时,我认为我们应该通过填充数据来使结果结构体的大小是缓存行大小的整数倍,即填充CACHE_LINE_SIZE - T % CACHE_LINE_SIZE
字节。那么,我的理解有什么问题吗?为什么填充1个字节就足够了?
sizeof(T)>CACHE_LINE_SIZE
,T
是否应该对齐到缓存行大小的整数倍?或者这不是必要的吗? - int3