0

作为参考,干扰大小是 C++17, P0154R1的一部分,并为 C++23, P1847R4提出了强制声明顺序。

据我所理解...

  • 第一个提议要求编译器将对齐的成员变量移得更近/更远。

  • 第二个建议将要求编译器按照类中的声明顺序排列成员变量。

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

4

1 回答 1

3

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

也就是说,这两个结构的布局相同,如果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实际上并没有改变任何行为。它消除了以前编译器在布置类中成员的顺序时可以使用的自由度。这种删除不会改变任何编译器的行为,因为......没有编译器利用这种自由度。这就是委员会将其删除的原因;没有人用它做任何事情。

此外,所述自由度是对具有不同访问类别 ( public/ private) 的成员进行布局的能力。自(至少)C++11 以来,访问类中成员的布局一直是声明顺序。

所以这两个变化彼此没有任何关系。

于 2021-10-13T15:39:51.303 回答