我知道您可以通过在 gcc 中使用例如属性((align(64)))将变量与缓存行对齐。但是,我对在结构声明时对齐(或者您可以将其称为填充)感兴趣。因此,例如,对于以下结构,我想要求编译器创建必要的填充,以便此结构的任何对象始终与缓存行对齐。
typedef struct
{
int a;
int b;
// I want the compiler to create a padding here for cache alignment
} my_type;
是的。我不记得我从哪里得到这个代码。我想可能是 Herb Sutter 的博客:
#define CACHE_LINE_SIZE 64 // Intel Core 2 cache line size.
template<typename T>
struct CacheLineStorage {
public:
[[ align(CACHE_LINE_SIZE) ]] T data;
private:
char pad[ CACHE_LINE_SIZE > sizeof(T)
? CACHE_LINE_SIZE - sizeof(T)
: 1 ];
};
这很简单。您可能只是错过了aligned
.
typedef struct
{
int a __attribute__((aligned(64)));
int b;
} my_type;
如果您创建变量或它的数组,则生成的结构在 b 之后将有一个 56 字节的填充。