是否有一个属性来强制填充变量后?
我有一个volatile(非缓存)变量声明如下:
volatile int foo __attribute__((aligned(CACHE_LINE_SIZE));
我想防止其他变量被分配到同一个缓存行,以避免一致性问题。我可以在foo后面添加一个填充变量,或者在同一个编译单元中将__attribute__((aligned(CACHE_LINE_SIZE))
设置为以下变量。然而,我想知道是否有一种更干净的方法来做到这一点,比如向变量foo
本身添加一个属性来强制填充。
3条答案
按热度按时间1sbrub3j1#
在这篇博客文章中介绍了一些选项:Aligning data with cache lines。
我建议使用C++11 alignas:
最简单的版本
自动添加填充位。您可以通过检查
sizeof(my_padded_type)
来验证它。详见下文。其他选项:
或
填充是由编译器自动完成的,请参阅此处的示例。
vktxenjb2#
以下是添加
std::hardware_destructive_interference_size
的原因:mklgxw1f3#
alignas(CACHE_LINE_SIZE)
在每个变量上都应该是这样的:Live demo
我假设你是在问关于对齐结构体成员的问题。
如果你不关心后续成员的对齐方式,但想确保没有其他数据放在
foo
的缓存行上,可以手动填充填充字节: