Почему стандарт C оставляет неопределенные переменные неопределенными? - PullRequest
9 голосов
/ 14 июля 2010

Где хранится значение мусора и с какой целью?

Ответы [ 5 ]

11 голосов
/ 14 июля 2010

C решает не инициализировать переменные некоторым автоматическим значением по соображениям эффективности. Для инициализации этих данных необходимо добавить инструкции. Вот пример:

int main(int argc, const char *argv[])
{
    int x;
    return x;
}

генерирует:

pushl %ebp
movl  %esp, %ebp
subl  $16, %esp
movl  -4(%ebp), %eax
leave
ret

Пока этот код:

int main(int argc, const char *argv[])
{
   int x=1;
   return x;
}

генерирует:

pushl %ebp
movl  %esp, %ebp
subl  $16, %esp
movl  $1, -4(%ebp)
movl  -4(%ebp), %eax
leave
ret

Как видите, для перемещения 1 в x используется полная дополнительная инструкция. Раньше это имело значение, и все еще имеет значение для встроенных систем.

7 голосов
/ 14 июля 2010

Значения мусора на самом деле нигде не хранятся. Фактически, значения мусора на самом деле не существуют, поскольку речь идет об абстрактном языке.

Видите ли, для генерации наиболее эффективного кода недостаточно, чтобы компилятор работал в условиях времени жизни объектов (переменных). Чтобы генерировать наиболее эффективный код, компилятор должен работать на более тонком уровне: он должен «мыслить» в терминах времен жизни значений . Это абсолютно необходимо для эффективного планирования регистров ЦП, например.

В абстрактном языке нет такого понятия, как «время существования ценности». Однако авторы языка признают важность этой концепции для оптимизирующих компиляторов. Чтобы дать компиляторам достаточно свободы для эффективной оптимизации, язык специально задан, чтобы он не мешал важной оптимизации. Вот где «мусорные ценности» входят в картину. Язык не утверждает, что значения мусора хранятся где-либо, язык не гарантирует, что значения мусора являются стабильными (то есть повторные попытки чтения одной и той же неинициализированной переменной могут легко привести к различным «значениям мусора»). Это сделано специально для того, чтобы позволить оптимизирующим компиляторам реализовать жизненно важную концепцию «времени жизни значения» и, таким образом, выполнить более эффективную манипуляцию с переменными, чем было бы продиктовано языковой концепцией «жизни объекта».

5 голосов
/ 14 июля 2010

IIRC, Томпсон или Ричи несколько лет назад дали интервью, в котором они сказали, что определение языка в некоторых местах преднамеренно оставляло неопределенность, поэтому разработчики на конкретных платформах имели возможность делать то, что имело смысл (циклы, память и т. Д.)* на этой платформе .Извините, у меня нет ссылки на ссылку.

3 голосов

Почему стандарт C оставляет неопределенными переменные неопределенными?

Он не:

3 голосов
/ 14 июля 2010

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

Когда вы пишете int x;, компилятор просто выделяет память для целого числа. Вы никогда не просили его что-либо там хранить, поэтому все, что было в этом месте, когда ваша программа запускалась, остается неизменным. Чаще всего оказывается, что ранее существующее значение является «мусором».

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

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