C ++:编译器是否会优化和变量;远?

时间:2009-07-17 10:04:56

标签: c++ optimization compiler-construction reference

在C ++中,这样的语句是有效的:

&Variable;

IMO它没有任何意义,所以我的问题是,如果你这样做,它会以任何方式影响编译结果,还是编译器会优化它?

谢谢!

6 个答案:

答案 0 :(得分:10)

请考虑以下代码段:

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

int main() {
    A a;
    &a;
    return 0;
};

在这种情况下,"&a;" 生成代码。

答案 1 :(得分:6)

值得记住,operator&amp;()可能会为变量类型重载,有一些副作用并且优化掉这样的语句会改变程序行为。

一个例子是用于控制非C ++对象的智能指针 - _com_ptr_t。 它有一个重载的_com_ptr_t :: operator&amp;(),它检查内部的指针是否已经存储了一些非空地址。如果事实证明存储的地址是非空的,则意味着指针已经附加到某个对象。如果发生这种情况,_com_ptr_t :: operator&amp;()将断开对象的连接 - 调用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&amp;()必须首先释放指针附加到的对象(如果有的话)。

所以对于_com_ptr_t这句话:

&variable;

具有相同的效果
variable = 0;

并将其优化会改变程序行为。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

你想删除它,但是担心你可能会改变程序的行为吗?

如果Variable的类重写了运算符地址(运算符&amp;),则可能会产生副作用。

答案 4 :(得分:1)

是的,这种说法很可能会得到优化。它意味着引用变量并将其丢弃。在“无优化”设置时,您的编译器可能会为此语句生成一些代码,它基本上是无操作的,并且通过优化,此语句应该消失。

答案 5 :(得分:0)

似乎你在堆栈或寄存器上引用了一个局部变量。找出编译器目前执行的操作的最佳方法是在Visual Studio中查看“反汇编”视图。

Disassembly view in Debugger (Visual Studio Orcas)