- Если у меня есть некоторые переменные и массивы (размер которых известен во время компиляции), внутри функции будет ли она по-прежнему выделяться, если функция вообще не вызывается?
Что говорит спец c
Если вы объявляете static
объекты внутри функции, тогда они существуют и сохраняют свои значения для всего время жизни программы. Существует только одна копия каждой такой переменной, независимо от того, сколько раз вызывается функция, и даже независимо от одновременных и рекурсивных вызовов.
Если вы объявляете не-static
объекты внутри функции, то каждое выполнение самого внутреннего содержащего блока получает свою собственную копию каждого, и каждая такая копия перестает существовать, когда заканчивается выполнение блока, с которым он связан.
Что вы можете увидеть на практике
C реализациям разрешено во многих отношениях отклоняться от деталей спецификации, если они производят такое же наблюдаемое поведение, как если бы они следовали инструкции c к букве , Среди отклонений, которые вы можете увидеть, есть
Если компилятор определяет, что данная функция никогда не может быть вызвана, то вся функция может быть опущена вместе с любыми переменными, которые она объявляет.
Если компилятор определит, что данная переменная не может быть прочитана, тогда переменная и любые записи в нее могут быть вообще опущены (если это не volatile
).
В принципе, программа не может распределять или инициализировать переменные состояния c до тех пор, пока к ним не будет получен первый доступ (хотя это маловероятно).
Хвостовые рекурсивные вызовы функций могут быть свернуты в итерации, так что локальные переменные функции используются повторно, а не новые создаются для каждого рекурсивного вызова.
Какое отношение это имеет к размеру файла. c и исполняемого файла .out?
Исходный файл. c состоит из кода, который вы пишете , Если вы напишите больше кода, то он будет больше. Если вы пишете меньше кода, то он становится меньше.
Возможно, вы имели в виду объектные файлы (.o по Unix соглашению). Spe c не говорит здесь о вопросе, и даже не говорит напрямую с такими файлами вообще. На практике реализации различаются, но обычно из всех локальных переменных, сохраняемых компилятором, только те, которые static
и объявлены с ненулевыми инициализаторами, занимают место в объектных файлах, двоичных библиотеках или исполняемых файлах.
Где я могу найти такие вещи? Вы знаете, некоторые хорошие книги по программированию, которые не только преподают язык, но и основополагающие принципы работы с памятью.
Извините, но эта часть вопроса вне обсуждения c для переполнения стека. Мы не отвечаем на вопросы, требуя рекомендаций для сторонних материалов, включая, помимо прочего, учебники и учебные пособия.