1

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

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 分配给该地址的代码?

4

2 回答 2

2

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

从您发布的两个示例中,我建议您对 const 和 static 限定符以及 C++11 中的新constexpr关键字感兴趣。一般来说,有空就不要忘记写const;它确实在优化过程中对编译器有所帮助。因为static这是另一个故事;事实证明,如果您仅在您已经非常有编程经验的情况下使用它对每个人都更安全,仅在某些特定情况下,并且有些人虔诚地反对完全使用它......

如果你想了解更多关于优化的知识,我会推荐这个网站,当然还有模板元编程可以帮助在编译时进行一些计算。

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

优化真的很令人兴奋,没错,但它不应该放在开发的首位。如果您编写了一些程序,并且您认为它可以运行得更快,那么问问自己如何,但大多数时候,尝试优化每条指令是无用的(而且危险且效率低下)。

以效率的名义(不一定实现)比任何其他单一原因犯下的计算罪都更多 - 包括盲目的愚蠢。 ”,WA Wulf

于 2013-05-06T21:41:55.723 回答
-2

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

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

因此,如果表达式是int y = x1 + x2,那么,是的,临时值将是一个 r 值,但在您的情况下,并且在定义x1 + x2的范围的生命周期内,它在内存中有一个可识别的位置,因此是一个 l 值。xx

于 2013-05-06T21:01:10.710 回答