是否在编译时确定了左值?

时间:2013-05-06 20:43:01

标签: c++ compiler-construction compilation compile-time lvalue

根据我的理解,左值只是一个位置,其对应的右值是存储在该位置的值。例如:

int x;
x = 0; /* the compiler will replace x with the location where 0 will be stored */
int y = x; /* x works as an rvalue here, its content is unknown until run time */

编译器可以在编译时知道第三行中x的值为0,这样它就可以直接用值0初始化y(而不是等到运行时,并且在运行时首先获取值x然后将该值赋予y)?

int *p = &x;
*p = 3;

这里第二行中的* p是左值(x的位置)。由于& x在编译时是已知的,所以* p在编译时也是已知的,对吗?

编译器是否只是将* p替换为x的位置,还是会生成首先将地址存储在p中的代码,然后将3分配给该地址?

2 个答案:

答案 0 :(得分:2)

我不确定你想要什么与左值或左值相关。如果我错了,请纠正我,但我感觉你想做一些“手动优化”,粗略地说,确保在编译时确定的事情不会在运行时进行任何计算。有很多方法可以做到这一点,有些方法比其他方法更复杂。

从您发布的两个示例中,我建议您对const和static限定符以及C ++ 11中的新constexpr关键字感兴趣。一般来说,永远不要忘记写const;它在优化期间确实有助于编译器。 static这是另一个故事;如果你只是在编程方面经验丰富,只在某些特定情况下使用它,并且有些人在宗教上反对完全使用它,那么每个人都会使用它更安全...

如果您想了解更多关于优化的信息,我建议this website,当然还有template-meta-programming可以帮助在编译时进行一些计算。

回到你的例子,你为什么要编写这样的东西并期望编译器为你做的工作?如果您知道y为0,为什么不自己写呢?如果稍后将更改y的值,除了在内存中为y分配空间之外,您将如何处理,并在您的代码“启动”时使用它复制值0(在运行时,那是)?如果根据只能在运行时解决的条件设置y的值,该怎么办?等

优化确实令人兴奋,但是它不应该在开发中首先出现。如果你已经编写了一些东西,并且认为它可以运行得更快,那么问问自己如何,但大多数时候,尝试优化每条指令都是无用的(而且是危险的,低效的)。

更多的计算罪是以效率的名义(不一定实现它)而不是任何其他单一原因 - 包括盲目的愚蠢。”,W.A。Wulf

答案 1 :(得分:-2)

我不会在表达式int y = x中说变量x是一个r值。它位于右侧的事实并不意味着它是一个r值。

根据定义,l值是占据内存中某些可识别位置的对象,例如x; r值只是对象,它们不是l值

因此,如果表达式为int y = x1 + x2,那么,是的,临时x1 + x2将是一个r值,但在您的情况下,以及{{1}的范围的生命周期} {已定义},x在内存中具有可识别的位置,因此是l值。