C++;:编译器会优化&;变量走开? 在C++中,这样的语句是有效的: &Variable;

C++;:编译器会优化&;变量走开? 在C++中,这样的语句是有效的: &Variable;,c++,optimization,compiler-construction,reference,C++,Optimization,Compiler Construction,Reference,在我看来,这没有任何意义,所以我的问题是,如果你这样做,它会以任何方式影响编译结果,还是编译器会优化它 谢谢 这完全取决于编译器和您使用的编译选项。在C++标准中没有任何东西可以防止编译器为这样的语句生成代码。值得记住的是运算符和()可能会为变量类型重载,有一些副作用,优化这种语句会改变程序行为。 一个例子是用于控制非C++对象的智能指针-。 它有一个重载的_com_ptr_t::operator&(),它检查内部的指针是否已经存储了一些非空地址。如果结果显示存储的地址为非空,则表示指针已附加到

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


谢谢

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

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

一个例子是用于控制非C++对象的智能指针-。 它有一个重载的_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
将具有与相同的效果

variable = 0;

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

是否要删除它,但担心会改变程序的行为

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

请考虑以下代码段:

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

int main() {
    A a;
    &a;
    return 0;
};
#包括
甲级{
公众:
A*运算符&(){

std::cout是的,这样的语句可能会被优化。这意味着引用变量并将其丢弃。虽然在“无优化”设置下,编译器可能会为此语句生成一些代码,但本质上是无操作的,经过优化后,此语句应该消失。

似乎您引用了s上的局部变量找出编译器目前正在做什么的最佳方法是在VisualStudio中查看反汇编视图


它很可能是优化的。不错。我的完全解释C++实现的计划仍然在轨道上;-将一个普通C++实现和一个目标系统的仿真器结合起来给你一个解释的C++实现。没有任何解释者的优势。不,这不算是解释。它不可能被忽略。除非模拟操作系统的编译器包含在主机中,否则请将“eval”作为扩展。可接受的最低用法:
eval(“#include\nvoid doit(){std::coutidally您可能希望评估在当前本地上下文上运行的一行程序,当然……如果您在代码中看到这一点,则可能是试图摆脱”“参数值未使用”或“变量未使用”警告。其他选项包括保持参数未命名(在C89中无效,因此对共享源代码没有好处)、不首先定义变量(如果构造函数具有您想要的副作用,则没有用),或者使用通常的方式,将其转换为void:
(void)Variable;
+1回答得很好。_com_ptr__t的这个属性曾经让我大吃一惊-我更喜欢它的功能是在成员函数中。我想说的是-你可能想添加一点,在不过载的情况下,它可能会被优化掉
#include <iostream>
class A {
public:
    A* operator &() {
        std::cout << "aaa" << std::endl;
        return this;
    }
};

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