int*_*nt3 9 c++ multithreading caching memory-alignment c++11
我最近在应用程序中遇到了我认为是错误共享的问题,我查阅了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 ];
};
Run Code Online (Sandbox Code Playgroud)
我可以看到当这CACHE_LINE_SIZE > sizeof(T)是真的时它会如何工作- 结构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)]],这将确保永远不会选择较小的对齐方式.
| 归档时间: |
|
| 查看次数: |
5632 次 |
| 最近记录: |