Прошло довольно много времени, я программировал на C / C ++, но некоторые области все еще ускользали от меня.Возможно, я не читал из хорошо написанного и авторитетного материала.
(1) В Linux / Unix есть ли ограничения на размер пользовательских программ?Максимальный размер стека, который может иметь программа?Максимальный объем памяти в куче, которую может использовать пользовательская программа?
(2) Я понимаю, что исполняемый файл C имеет раздел данных, раздел кода и раздел стека.Если программа получает много рекурсивных вызовов, ей потребуется большой объем стека.Является ли этот стек предопределенным размером или будет расти по мере увеличения рекурсии?В случае роста адресное пространство программы также должно динамически увеличиваться?Если это так, не замедлит ли это программу?
(3) Точно так же, когда память из кучи выделяется программе во время выполнения, когда программа выделяет память, эту область кучи необходимо будет добавить в адресное пространство.программы?Таким образом, в этом случае также необходимо обновить таблицу страниц программы.Верно ли мое понимание?
(4) Почему два файла (которые я собираюсь объединить в один исполняемый файл) не могут иметь глобальную переменную с одинаковым именем.Это поможет пролить некоторый свет на то, как выглядят объектные файлы.
Дополнение:
Я читаю стандарт ISO C99 с http://www.open -std.org / ОТК1 / SC22 / WG ... Docs / n1256.pdf .На странице 42 говорится:
6.2.2 Связи идентификаторов 1 Идентификатор, объявленный в разных областях или в одной и той же области более одного раза, может быть создан для ссылки на один и тот же объект или функцию с помощью процесса, называемого связыванием.Существует три вида связи: внешняя, внутренняя и отсутствует.
2 В наборе модулей перевода и библиотек, составляющих целую программу, каждое объявление определенного идентификатора с внешней связью обозначает один и тот же объект или функцию,В пределах одной единицы перевода каждое объявление идентификатора с внутренней связью обозначает один и тот же объект или функцию.Каждое объявление идентификатора без привязки обозначает уникальную сущность.
3 Если объявление идентификатора области видимости объекта или функции содержит статический спецификатор класса хранения, идентификатор имеет внутреннюю связь.
4 Для идентификатора, объявленного с помощью спецификатора класса хранения extern в области видимости, в которой видно предыдущее объявление этого идентификатора, если предыдущее объявление указывает внутреннюю или внешнюю связь, связь идентификатора в последующем объявлении будеттак же, как и связь, указанная в предыдущей декларации.Если никакое предыдущее объявление не видно или если в предыдущем объявлении не указана связь, то идентификатор имеет внешнюю связь.
5 Если объявление идентификатора для функции не имеет спецификатора класса хранения, определяется его связьточно так же, как если бы он был объявлен с помощью спецификатора класса хранения extern. Если объявление идентификатора объекта имеет область видимости файла и не имеет спецификатора класса хранения, его связь является внешней.
После прочтения этого выглядит так, чтоесли я объявлю переменную, как, скажем, int в 2 исходных файлах.тогда оба имеют внешнюю связь согласно правилу 5 и 4. и затем согласно правилу 2 оба должны ссылаться на один и тот же объект.Тогда почему компилятор создает проблему.Где в стандарте намекают, что мы не можем объявить так в 2 исходных файлах, и это должно привести к ошибке компиляции.
Спасибо.