C++硬件干扰大小特性与强制类成员声明顺序如何协同工作?
C++ P0154R1 与 P1847R4 适配规则说明
参考说明:干扰大小是C17的特性组成部分,对应提案P0154R1;强制声明顺序是C23拟新增特性,对应提案P1847R4。
目前普遍对两个提案核心诉求的理解为:
- P0154R1提案要求编译器调整
alignas修饰的成员变量间距,以匹配干扰大小要求。 - P1847R4提案要求编译器严格按照类中成员的声明顺序完成内存布局。
核心疑问解答
两个提案不存在功能冲突,P1847R4不会削弱P0154R1的效果,二者的适配规则如下:
- P1847R4仅约束成员的内存排布顺序,没有修改C++标准中一直存在的成员对齐、自动填充规则,和P0154R1的能力边界完全不重叠。
- 针对
hardware_destructive_interference_size的使用场景:如果两个需要避免缓存伪共享的成员按声明顺序排列,编译器依然可以在两个成员之间插入符合要求的填充字节,满足干扰大小要求,不需要用其他成员填充,也不违反P1847R4的规则。 - 针对
hardware_constructive_interference_size的使用场景:只要开发者把需要共享缓存行的成员按顺序连续声明,编译器就会按照声明顺序排布,只要二者总大小不超过干扰大小,就会自动落在同一个缓存行内,不需要降级为告警。仅当开发者没有把需要共享缓存的成员连续声明时,才会触发提示让开发者调整顺序,这本身也符合两个提案的设计初衷。
内容的提问来源于stack exchange,提问作者Uri Raz
相关产品推荐
相关产品推荐

