C++:编译器会优化掉变量&Variable吗?

4
在C++中,以下语句是有效的:

&Variable;

我认为这没有意义,所以我的问题是,如果你这样做会对编译结果产生影响,或者编译器会将其优化掉吗?

谢谢!


1
如果您在代码中看到这个,可能是为了消除“参数值未使用”或“变量未使用”的警告。其他选项是将参数命名为空(在C89中无效,因此不适用于共享源),首先不定义变量(如果构造函数具有您想要的副作用,则无用),或者通常的方法,即强制转换为void:(void)Variable; - Steve Jessop
6个回答

10

考虑下面这段代码:

#include <iostream>
class A {
public:
    A* operator &() {
        std::cout << "aaa" << std::endl;
        return this;
    }
};

int main() {
    A a;
    &a;
    return 0;
};
在这种情况下,"&a;" 会生成代码

6
值得记住的是,operator&() 运算符可能被变量类型重载,具有某些副作用,优化这样的语句会改变程序行为。
一个例子是用于控制非 C++ 对象的智能指针 - _com_ptr_t。它有一个重载的 _com_ptr_t::operator&(),用于检查内部指针是否已经存储了一些非空地址。如果发现存储的地址是非空的,则意味着指针已经附加到某个对象上。如果发生这种情况,_com_ptr_t::operator&() 将断开对象 - 调用 IUnknown::Release() 并将指针设置为 null。
这里的副作用是必要的,因为典型的用法是这样的:
_com_ptr_t<Interface> pointer;
// some other code could be here
CoCreateInstance( ..., &pointer, ...);// many irrelevant parameters here

CoCreateInstance()或其他对象检索代码不了解C++和_com_ptr_t,因此它只是覆盖传递给它的地址。这就是为什么_com_ptr_t :: operator&()必须首先释放指针所附加的对象(如果有的话)。

因此,对于_com_ptr_t,该语句如下:

&variable;

将具有相同的效果

variable = 0;

优化掉它会改变程序行为。


+1个好答案。_com_ptr_t的那个属性曾经让我非常困扰 - 我更喜欢将其功能放在成员函数中。 - peterchen
我想说的是 - 你可能需要添加一些内容,否则它很可能会被优化掉。 - peterchen

2

这完全取决于您使用的编译器和编译选项。C++标准中没有任何内容阻止编译器为这样的语句生成代码。


它很可能会被优化掉。 - Goz
很好。我对于完全解释执行的C++实现计划仍然在进展中;-) - Steve Jessop
将普通的 C++ 实现与目标系统模拟器结合使用,即可获得解释型 C++ 实现。但是,这种实现没有任何解释器的优点。 - AProgrammer
不,这不算解释执行。除非在主机中包含模拟操作系统的编译器,否则它无法将“eval”实现为扩展。最低可接受用法:eval("#include <iostream>\nvoid doit() { std::cout<<\"hello world\n\"; }","doit"); 这应该像将字符串写入文件一样运行,将其编译为动态库,链接它,打开其符号表,查找函数指针并调用它;-) - Steve Jessop
理想情况下,您希望在当前本地上下文中运行评估单行代码... - Steve Jessop

1
你想要移除它,但是担心可能会改变程序的行为吗?
如果Variable的类重载了取地址运算符(operator&),那么它可能会产生副作用。

1
是的,这样的语句很可能会被优化。它意味着将一个变量的引用丢弃。在“无优化”设置下,编译器可能会为此语句生成一些代码,但它实际上不执行任何操作;而在优化时,此语句应该会被去除。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接