我还在学习C ++。我试图以一种相当循序渐进的方式理解评估是如何进行的。所以使用这个简单的例子,表达式声明:
int x = 8 * 5 - 5;
这是我相信发生的事情。请告诉我离我有多远:
对操作数x,8,5和5进行评估。"可能会创建一个临时对象来保存每个值(我对此不太确定)。
8 * 5评估为40,存储在临时。
40(临时) - 5评估为35(另一个临时)。
35被复制到x。
所有临时对象都按其创建的相反顺序销毁(该值将被丢弃)。
我至少接近正确吗?
答案 0 :(得分:0)
“谢谢你,先生。嗯。如果所有的操作数都是命名对象而不是文字,会发生什么?它会动态创建临时数据,可以说,而不是在编译时?”
正如萨姆提到的那样,你处于高水平的正确轨道上。 在您的第一个示例中,它将使用CPU寄存器来存储临时对象(因为它们不是命名对象),如果它们将是命名对象,则它取决于在编译器上设置的优化标志以及关于如何“优化”的代码的复杂性'代码将被生成。你可以看一下反汇编,看看会发生什么。例如,如果你这样做
a = 5;
b = 2;
c = a * b;
编译器将尝试生成最优的代码,因为在这种情况下有2个常量在编译时已知,并且你乘以2,它将能够采用快捷方式,有时候乘法被替换比特操作更便宜(乘以2与向左移动1相同)
命名变量必须存在于堆栈或堆上的某个地方,并且CPU将使用命名对象的地址来传递它们并执行函数。 (如果它们足够小,它将适合寄存器并对它们进行操作,否则它将开始使用内存,首先是缓存,然后流出到RAM)
您可以谷歌搜索“抽象语法树”,以了解可读的c ++代码如何转换为机器代码。
这就是为什么学习const正确性,别名和指针与引用很重要的原因,以确保为编译器提供为您生成最佳代码的最佳机会。 (除了用户从中获得的优势)