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

cla*_*amp 4 c++ compiler-construction optimization reference

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

&Variable;
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Ale*_*x B 10

请考虑以下代码段:

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

int main() {
    A a;
    &a;
    return 0;
};
Run Code Online (Sandbox Code Playgroud)

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


sha*_*oth 6

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

一个例子是用于控制非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
Run Code Online (Sandbox Code Playgroud)

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

所以对于_com_ptr_t这句话:

&variable;
Run Code Online (Sandbox Code Playgroud)

会有同样的效果

variable = 0;
Run Code Online (Sandbox Code Playgroud)

并优化它将改变程序行为.