C ++: оптимизирует ли компилятор & Variable; далеко? - PullRequest
4 голосов
/ 17 июля 2009

В C ++ утверждение, подобное этому, допустимо:

&Variable;

IMO, это не имеет никакого смысла, поэтому мой вопрос: если вы сделаете это, это каким-либо образом повлияет на скомпилированный результат, или компилятор его оптимизирует?

Спасибо!

Ответы [ 6 ]

10 голосов
/ 17 июля 2009

Рассмотрим этот фрагмент:

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

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

В этом случае "&a;" будет генерировать код.

6 голосов
/ 17 июля 2009

Стоит помнить, что оператор & () может быть перегружен для типа переменной, иметь некоторые побочные эффекты, и оптимизация такого оператора может изменить поведение программы.

Одним из примеров является умный указатель, используемый для управления объектами не-C ++ - _com_ptr_t . Он имеет перегруженный _com_ptr_t :: operator & (), который проверяет, хранит ли указатель внутри какой-либо ненулевой адрес. Если оказывается, что сохраненный адрес не нулевой, это означает, что указатель уже прикреплен к какому-либо объекту. Если это происходит, _com_ptr_t :: operator & () отключает объект - вызывает IUnknown :: Release () и устанавливает указатель на ноль.

Побочный эффект здесь необходим, потому что типичное использование:

_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 голосов
/ 17 июля 2009

Это полностью зависит от компилятора и параметров компиляции, которые вы используете. В Стандарте C ++ нет ничего, что мешало бы компилятору генерировать код для такого оператора.

1 голос
/ 17 июля 2009

Да, такое утверждение, вероятно, будет оптимизировано. Это означает взять ссылку на переменную и выбросить ее. Хотя при настройке «без оптимизации» ваш компилятор может сгенерировать некоторый код для этого оператора, он по сути не работает, и с оптимизацией этот оператор должен исчезнуть.

1 голос
/ 17 июля 2009

Вы хотите удалить его, но беспокоитесь, что можете изменить поведение программы?

Это может иметь побочные эффекты, если класс Variable переопределяет адрес оператора (operator &).

0 голосов
/ 17 июля 2009

Кажется, вы берете ссылку на локальную переменную в стеке или регистре. Лучший способ узнать, что в данный момент делает компилятор, - это просмотреть представление «Разборка» в Visual Studio.

Вид разборки в отладчике (Visual Studio Orcas)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...