Будет ли статическая переменная всегда использовать память? - PullRequest
3 голосов
/ 13 октября 2011

Исходя из этого обсуждения , мне было интересно, всегда ли статическая переменная области действия функции использует память или компилятору разрешено оптимизировать это.Чтобы проиллюстрировать этот вопрос, предположим, что такая функция:

void f() {
   static const int i = 3;
   int j = i + 1;
   printf("%d", j);
}

Компилятор, скорее всего, будет указывать значение i и, вероятно, также выполнит вычисление 3 + 1 во время компиляции.Поскольку это единственное место, где используется значение i, нет необходимости выделять статическую память.Так разрешено ли компилятору оптимизировать статическое удаление, или стандартное требование о выделении памяти для любой статической переменной?

Ответы [ 3 ]

6 голосов
/ 13 октября 2011

Итак, разрешено ли компилятору оптимизировать статические данные [...]?

Да.В соответствии со стандартом:

1.9 Выполнение программы

Семантические описания в этом международном стандарте определяют параметризованную недетерминированную абстрактную машину.Настоящий международный стандарт не предъявляет требований к структуре соответствующих реализаций.В частности, им не нужно копировать или эмулировать структуру абстрактной машины.Скорее, соответствующие реализации требуются для эмуляции (только) наблюдаемого поведения абстрактной машины, как описано ниже. 5)

... и сноска гласит:

5) Это положение иногда называют правилом «как будто», потому что реализация может свободно игнорировать любое требование настоящего международного стандарта, если в результате будет выполнено требование, насколько это можно определить изнаблюдаемое поведение программы.Например, фактическая реализация не должна оценивать часть выражения, если она может сделать вывод, что ее значение не используется и что не возникает никаких побочных эффектов, влияющих на наблюдаемое поведение программы.

Что это всеЭто означает, что компилятор может делать с вашим кодом все, что захочет, при условии, что наблюдаемое поведение остается тем же.Поскольку вы не взяли адрес static const, компилятор может оптимизировать значение до константного интегрального выражения.

6 голосов
/ 13 октября 2011

В соответствии с разделом 1.8 The C++ object model n3242

Объект имеет тип и длительность хранения (необязательно имя).
Для него не требуется место в памяти, если не взят его адрес.

0 голосов
/ 13 октября 2011

Нет, он не всегда будет использовать память.Моя версия GCC 4.5.2 производит код с реальной глобальной переменной на -O0, но использует непосредственно встроенную константу 4 при компиляции с `-O3 '

...