C++ 硬件破坏性和建设性干扰大小如何与强制声明顺序一起使用?

How would C++ hardware destructive & constructive interference size work with the mandated declaration order?

作为参考,干扰大小是 C++17 的一部分,P0154R1, and mandated declaration order is proposed for C++23, P1847R4

据我了解...

在我看来,第二个提案比第一个提案更胜一筹。 hardware_destructive_interference_size 必然需要在两个成员变量之间留下未使用的内存,并且无法选择用其他成员填充它。 hardware_constructive_interference_size 将减少为警告说“不能这样做,尝试自己重新排序成员变量”。

P0154 不改变成员变量的布局方式。它只是暴露了一些constexpr变量,你可以通过alignas来调整成员变量的对齐方式。但是 alignas 没有获得任何特殊属性。

也就是这两个struct的布局是一样的,如果hardware_destructive_interference_size是64:

struct one
{
  alignas(hardware_destructive_interference_size) int member1;
  alignas(hardware_destructive_interference_size) int member2;
};

struct two
{
  alignas(64) int member1;
  alignas(64) int member2;
};

P1847 实际上并没有改变任何行为。它消除了以前编译器在 class 中安排成员顺序时可用的自由度。这种删除不会改变任何编译器的行为,因为......没有编译器利用这种自由度。这就是 为什么 委员会要删除它;没有人用它做任何事情。

另外,所说的自由度是对具有不同访问权限的成员进行布局的能力 classes (public/private)。 访问class内的成员布局自(至少)C++11以来一直是声明顺序。

所以这两个变化之间没有任何关系。