正如标题所说,
一个典型的答案是:
允许任何和所有代码转换不会改变程序的可观察行为的规则
我们会不时地从某些实现中获取行为,这些行为归因于此规则.好多次错了.那么,这个规则究竟是什么呢.标准没有明确地将此规则作为一个部分或段落提及,那么究竟什么属于这条规则的范围?对我来说,这似乎是一个灰色区域,标准没有详细定义.有人可以根据标准的参考资料详细说明细节.
注意:将其标记为C和C++,因为它与两种语言都相关.
只要as-if规则成立,C&C++编译器就可以重新排序操作.编译器执行此类重新排序的示例是什么,通过这样做可以获得哪些潜在的性能提升?
欢迎在任何平台上涉及任何(C/C++)编译器的示例.
可能重复:
为什么析构函数只被调用一次?
鉴于下面的代码,我无法理解gcc中的输出.我希望创建和销毁两个对象,但只能看到对构造函数和析构函数的一次调用.这里发生了什么事?
#include <string>
#include <iostream>
struct Huge{
Huge() { std::cout << "Constructor" << std::endl; }
Huge(Huge const &r) { std::cout << "Copy Constructor" << std::endl; }
~Huge() { std::cout << "Destructor" << std::endl; }
};
Huge g() {
std::cout << "Entering g" << std::endl;
Huge temp;
std::cout << "Exiting g" << std::endl;
return temp;
}
int main(){
Huge h2(g());
std::cout << "Before leaving main" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
g ++(4.4)中此代码的输出是
输入g
构造函数
退出g
在离开主要之前
析构函数