在C ++中,这样的语句是有效的:
&Variable;
IMO它没有任何意义,所以我的问题是,如果你这样做,它会以任何方式影响编译结果,还是编译器会优化它?
谢谢!
答案 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中查看“反汇编”视图。