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。
据我了解...
第一个提议要求编译器将对齐的成员变量移得更近/更远。
第二个提案要求编译器按照class.
中声明的顺序排列成员变量
在我看来,第二个提案比第一个提案更胜一筹。 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以来一直是声明顺序。
所以这两个变化之间没有任何关系。
作为参考,干扰大小是 C++17 的一部分,P0154R1, and mandated declaration order is proposed for C++23, P1847R4。
据我了解...
第一个提议要求编译器将对齐的成员变量移得更近/更远。
第二个提案要求编译器按照class.
中声明的顺序排列成员变量
在我看来,第二个提案比第一个提案更胜一筹。 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以来一直是声明顺序。
所以这两个变化之间没有任何关系。