|
|
1
3
假设
此类优化包含在C++标准“仿佛规则”[C++20 N4860 intro.abstract p1]中。抽象地说,代码必须完全按照编写的方式执行。但是,如果编译器能够证明,假设程序没有未定义的行为,则转换不会改变程序的可观察行为,那么它就可以应用转换。(或者,如果程序有不止一种有效的执行方式,那么至少它必须确保它仍然以其中一种有效方式运行。) 在多线程程序的情况下,“假设程序没有未定义的行为”经常发挥作用,应用于数据竞赛。一个典型的例子是:
在这里,编译器可以假设
你可能会说,“但难道其他线程不可能修改吗
在上面的程序中,编译器看不到这样的同步是可能的,因为在的两次读取之间
然而,在您发布的代码中
是
同步发生的一种方式。当你暂时释放锁时,其他线程可能会占用它,修改
因此,上的所有操作
再一次,所有这些都假设
话虽如此,如果可以的话,编译器可以自由地打破这些规则中的任何一个
证明
它对其他UB免费程序没有任何区别。作为一个简单的例子,可以通过编译器选项指定程序将单线程运行。在这种情况下,编译器可以将所有原子对象降级为普通对象,并删除所有互斥操作和内存屏障。然后它也可以删除的第二个检查
|
|
|
gd1234 · 编译器会知道跳过这个循环吗? 1 年前 |
|
|
ChrisB · 为什么Rust不为内存布局重新排序枚举中的字段? 2 年前 |
|
|
Hans · 避免在C++中优化未使用的变量? 2 年前 |