我正在创建一个非常快速的多线程离散事件模拟框架,该框架的核心使用原子和无锁编程技术,在许多线程之间实现非常快速的执行。这要求我将一些变量与缓存行对齐,并填充剩余的缓存行空间,以避免缓存行竞争。以下是我的做法:
// compute cache line padding size
constexpr u64 CLPAD(u64 _objSize) {
return ((_objSize / CACHELINE_SIZE) * CACHELINE_SIZE) +
(((_objSize % CACHELINE_SIZE) > 0) * CACHELINE_SIZE) -
_objSize;
}
alignas(CACHELINE_SIZE) MyObject myObj;
char padding[CLPAD(sizeof(myObj))];
这对我来说很有效,但今天我在使用此方法处理新对象类型时遇到了一个问题。CLPAD()函数返回填充输入类型到下一个缓存行所需的字符数。然而,如果我输入的类型恰好是缓存行数量的倍数,则CLPAD返回0。如果您尝试创建大小为零的数组,则会出现以下警告/错误:
ISO C++ forbids zero-size array 'padding'
我知道我可以修改CLPAD()来在这种情况下返回CACHELINE_SIZE,但是这样做会浪费一个缓存行的空间。
如果CLPAD返回0,我怎样才能使“padding”的声明消失?
padded
而不需要嵌套的type
(除非这是一些元编程技巧)。 - Andrey Turkinpadded<>
的类型包含模板参数,而类型别名提供了一个匿名结构,该结构没有模板参数。 - user2296177