Размер стека и памяти кучи

Возможный дубликат:
Что и где находятся стек и куча?

Что касается основных концепций макета памяти в программе ac, я понимаю следующее:

  • Язык использует два основных стека структур данных и кучу .
  • Стек создается для хранения локальных переменных и данных бухгалтерского учета подпрограмм
  • Куча создана для хранения динамически распределенных переменных программы
  • Куча имеет переменную длину в природе. (Не очень уверен в стеке)
  • Обычно компилятор / Язык несет ответственность за запрос ОС на создание этих структур данных перед выполнением.

Вопросов

  • Каков первоначальный размер, с которым создается стек / куча? и кто это решает?
  • В какой физической памяти они созданы? Я вижу общее описание: «Стек создан в верхнем уровне-адресе и куче на низкоуровневом адресе». Пожалуйста, объясните это

    «Стек создан в верхнем уровне-адресе и куче на низкоуровневом адресе» Пожалуйста, разъясните это

    Это миф. Это может быть основой исторической правды. Иногда это может резонировать с вещами, которые вы видите в реальной жизни. Но это не буквально верно.

    Достаточно легко изучить, хотя:

    #include  #include  void check(int depth) { char c; char *ptr = malloc(1); printf("stack at %p, heap at %p\n", &c, ptr); if (depth <= 0) return; check(depth-1); } int main() { check(10); return 0; } 

    На моей машине я вижу:

     stack at 0x22ac3b, heap at 0x20010240 stack at 0x22ac0b, heap at 0x200485b0 stack at 0x22abdb, heap at 0x200485c0 stack at 0x22abab, heap at 0x200485d0 stack at 0x22ab7b, heap at 0x200485e0 stack at 0x22ab4b, heap at 0x200485f0 stack at 0x22ab1b, heap at 0x20048600 stack at 0x22aaeb, heap at 0x20048610 stack at 0x22aabb, heap at 0x20048620 stack at 0x22aa8b, heap at 0x20048630 stack at 0x22aa5b, heap at 0x20048640 

    Таким образом, стек идет вниз, а куча идет вверх (как вы могли бы ожидать, основываясь на мифе), но стек имеет меньший адрес, и они не растут друг к другу (миф оборван).

    Btw, моя функция check является хвостовой рекурсивной, и в некоторых реализациях с некоторыми параметрами компилятора вы можете увидеть, что стек не перемещается вообще. Что говорит вам о том, почему стандарт не дает мандата, как все это работает - если бы это было сделано, это могло бы непреднамеренно запретить полезные оптимизации.

    Как уже упоминалось, размеры зависят от ОС. Например, для окон с использованием Visual Studio размер стека по умолчанию составляет 1 МБ

    MSDN

    В Linux следующая команда может показать вашу текущую.

     ulimit -s or -a 

    На мой 64-битный битва Linux он показывает 8192 КБ.

    Каждая программа, загруженная в память, имеет несколько сегментов. В сборке можно указать каждый из тех, кто использует префикс .data, .code и т. Д. (Intelx86).

    Это сегмент данных, который имеет несколько подсекций. Оба стека и кучи являются частью этого в дополнение к нескольким другим.

    Стек также может вырасти неявно, т. Е. Когда вы выполняете другой вызов функции, запись активации включается в стек, используя при этом больше памяти стека. Вот почему бесконечная recursion приводит к сбою, когда у программы заканчивается выделенный стек.

    Когда вызов функции возвращается, эта запись активируется и стек сжимается.

    Напротив, куча растет с противоположного направления и содержит всю динамически распределенную память.

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

    —— стек начинается ———– стек растет вниз

    ——– Если они не пересекают друг друга, программа работает нормально.

    ——- начинается куча ———— куча растет вверх

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

    Другими частями сегмента данных являются BSS и т. Д., Которые могут содержать такие поля, как неинициализированные статические переменные

    Каков первоначальный размер, с которым создается стек / куча? и кто это решает?

    Это зависит от компилятора и ОС.

    В какой физической памяти они созданы? Я вижу общее описание: «Куча создана в верхнем уровне-адресе и стек на низкоуровневом адресе».

    Это зависит от компилятора и ОС.

    В самом деле. Стандарт языка не задает минимальный размер стека и не указывает местоположение стека или кучи в памяти. И причина этого в том, чтобы сделать программы C менее зависимыми от этих деталей и, следовательно, более переносимыми на разные платформы (читайте: разные ОС, разные процессоры, разные компиляторы).

    Прежде всего, стандарт C не накладывает никаких требований относительно того, как стек / куча реализуется платформой.

    What is the initial size with which a stack/heap is created? and who decides it?

    Как правило, фиксированный размер стека выделяется для каждого процесса ОС, который является специфичным для платформы. Нет ограничений на размер кучи, у программы обычно есть все доступное виртуальное адресное пространство.

    Wherein physical memory are they are created?

    Это специфичная платформа. Обычно стек растет вниз, а куча растет вверх.

    Давайте будем гением компьютера.