Возврат статической локальной ссылки - PullRequest
1 голос
/ 03 февраля 2012

Предположим, у меня есть функция, которая будет возвращать большую структуру данных с намерением, чтобы вызывающая сторона немедленно скопировала возвращаемое значение:

Large large()
{
    return Large();
}

Теперь предположим, что я не хочу полагаться на какие-либоОптимизация компилятора, такая как оптимизация возвращаемого значения и т. д. Также предположим, что я не могу полагаться на конструктор перемещения C ++ 11.Я хотел бы собрать некоторые мнения о «правильности» следующего кода:

const Large& large()
{
    static Large large;
    large = Large();
    return large;
}

Он должен работать как задумано, но это плохой стиль, чтобы возвращать ссылку на статический локальный, даже если это constквалифицированный

Ответы [ 2 ]

4 голосов
/ 03 февраля 2012

Все зависит от того, что должно работать так, как ожидается . В этом случае все абоненты будут делиться ссылками на одну и ту же переменную. Также обратите внимание, что если вызывающие программы будут копировать, то вы фактически отключите RVO (оптимизацию возвращаемого значения), которая будет работать во всех текущих компиляторах [*] .

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

[*] Соглашение о вызовах во всех известных мне компиляторах определяет, что функция, которая возвращает переменную large (т.е. не соответствует регистру), получает скрытый указатель на местоположение, в котором вызывающий объект выделил место для переменной. То есть оптимизация инициируется соглашением о вызовах.

3 голосов
/ 03 февраля 2012

Я не думаю, что есть какие-либо проблемы с этим. До тех пор, пока эта кодовая база является и всегда будет однопоточной.

Сделайте это с многопоточным фрагментом кода, и вы, возможно, никогда не сможете понять, почему ваши данные иногда случайно повреждены.

...