Где хранится стоимость мусора и с какой целью?
Почему стандарт C оставляет неопределенные переменные undefined?
Ответ 1
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 используется полная дополнительная команда. Это имело значение и по-прежнему относится к встроенным системам.
Ответ 2
IIRC, Томпсон или Ричи несколько лет назад сделали интервью, в котором они сказали, что определение языка намеренно оставило вещи неопределенными в некоторых местах, поэтому разработчики на конкретных платформах имели возможность делать то, что имело смысл (циклы, память и т.д.) на этом Платформа. Извините, у меня нет ссылки на ссылку.
Ответ 3
Значения мусора не хранятся нигде. Фактически, значения мусора на самом деле не существуют, что касается абстрактного языка.
Вы видите, что для генерации наиболее эффективного кода недостаточно, чтобы компилятор работал с точки зрения времени жизни объектов (переменных). Чтобы сгенерировать наиболее эффективный код, компилятор должен работать на гораздо более тонком уровне: он должен "думать" о сроках жизни значений. Это абсолютно необходимо для эффективного планирования регистров процессора, например.
Абстрактный язык не имеет понятия "время жизни". Однако авторы языка признают важность этой концепции для оптимизирующих компиляторов. Чтобы предоставить компиляторам достаточную свободу для эффективной оптимизации, язык намеренно задается так, чтобы он не мешал важным оптимизации. Здесь "изображения мусора" вступают в картину. Язык не указывает, что значения мусора хранятся в любом месте, этот язык не гарантирует, что значения мусора стабильны (т.е. Повторные попытки прочитать одну и ту же неинициализированную переменную могут легко привести к различным "значениям мусора" ). Это делается специально для того, чтобы оптимизировать компиляторы для реализации жизненной концепции "времени жизни значения" и, таким образом, выполнять более эффективные манипуляции с переменными, чем это было бы диктуется языковой концепцией "времени жизни объекта".
Ответ 4
C был разработан как относительно низкоуровневый язык, так что его можно было бы использовать для написания, а также для низкоуровневых материалов, таких как операционные системы. (на самом деле он был разработан так, чтобы UNIX мог быть написан на C). Вы можете просто подумать об этом как о коде сборки с читаемым синтаксисом и конструкциями более высокого уровня. По этой причине C (минус оптимизация) делает именно то, что вы просите об этом, ничего больше, не меньше.
Когда вы пишете int x;
, компилятор просто выделяет память для целого. Вы никогда не просили его хранить что-нибудь там, поэтому все, что было в этом месте, когда ваша программа начиналась как таковая. Чаще всего оказывается, что ранее существовавшее значение - "мусор".
Иногда внешняя программа (например, драйвер устройства) может записывать некоторые из ваших переменных, поэтому нет необходимости добавлять другую команду для инициализации таких переменных.
Ответ 5
Почему стандарт C оставляет неопределенные переменные undefined?
Нет:
-
для локальных переменных, это говорит о поведении undefined, что означает, что все (например, segfault, стирание вашего жесткого диска) является законным: (Почему) использует неинициализированный переменная undefined поведение?
-
для глобальных переменных, он нулирует их: Что происходит с объявленной, неинициализированной переменной в C? Имеет ли значение?