C++:编译器会优化 &Variable;走了吗?

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

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

&Variable;

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

c++ optimization reference
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;

优化它会改变程序行为。


2
投票

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


1
投票

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

如果变量的类覆盖运算符地址(operator&),可能会产生副作用。


1
投票

是的,这样的说法很可能会被优化。这意味着获取对变量的引用并将其丢弃。虽然在“无优化”设置下,您的编译器可能会为此语句生成一些代码,但它本质上是无操作,并且通过优化,该语句应该消失。


0
投票

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

调试器中的反汇编视图 (Visual Studio Orcas)

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