左值是在编译时确定的吗?

问题描述 投票:0回答:2

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

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,从而可以直接将y初始化为0(而不是等到运行时,在运行时先获取x的值,然后将该值赋予 y)?

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

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

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

c++ compilation compile-time lvalue
2个回答
2
投票

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

从您发布的两个示例中,我建议您对 const 和 static 限定符以及 C++11 中新的 constexpr 关键字感兴趣。一般来说,尽可能不要忘记写

const
;它在优化过程中确实对编译器有帮助。对于
static
来说则是另一个故事了;事实证明,如果您只有在编程方面已经相当有经验的情况下才使用它,并且仅在某些特定情况下使用它,并且有些人坚决反对完全使用它,那么它对每个人来说都会更安全......

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

回到你的例子,你为什么要写这样的东西并期望编译器为你做这些工作?如果你知道

y
是0,为什么不自己写呢?如果
y
的值稍后会发生变化,除了在内存中为
y
分配空间,并在代码“开始”使用它时(在运行时,是)?如果
y
的值是根据只能在运行时解决的条件设置的,该怎么办?等等

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

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


-2
投票

我不会说在表达式

int y = x
中,变量
x
是一个 r 值。它位于右侧这一事实并不意味着它是 r 值。

根据定义,左值是占据内存中某个可识别位置的对象,例如

x
; r 值只是不是 l 值的对象

因此,如果表达式是

int y = x1 + x2
,那么,是的,临时
x1 + x2
将是一个 r 值,但在您的情况下,并且对于定义
x
的范围的生命周期,
x
具有内存中可识别的位置,因此是左值。

© www.soinside.com 2019 - 2024. All rights reserved.