Как узнать максимальный размер стека памяти для программы на C ++ в Linux? (компилятор GNU) - PullRequest
2 голосов
/ 25 марта 2009

Мне любопытно узнать, каков максимальный размер стека для конкретной комбинации компилятор / операционная система. Я использую компилятор Ubuntu / GNU. Кроме того, у меня есть несколько вопросов:

  1. Кто контролирует максимальный размер стека по умолчанию; ОС или компилятор?
  2. Максимально ли масштабируется по умолчанию в соответствии с общим объемом памяти? (т. е. машина с объемом памяти 2 ГБ будет иметь больший размер по умолчанию, чем машина с всего 512 МБ). Для этого примера обе машины имеют одинаковую настройку ОС / компилятора, просто разные объемы системной памяти.

Спасибо!

Ответы [ 4 ]

6 голосов
/ 25 марта 2009

Кто контролирует максимальный размер стека по умолчанию; ОС или компилятор?

Компилятор обычно. ОС / аппаратное обеспечение ограничивает его в определенной степени. По умолчанию 8 МБ на Linux IIRC. Подумайте о ulimit -s в Linux (чтобы изменить размеры стека).

Максимально ли масштабируется по умолчанию в соответствии с общим объемом памяти? (т. е. машина с объемом памяти 2 ГБ будет иметь больший размер по умолчанию, чем машина с всего 512 МБ). Для этого примера обе машины имеют одинаковую настройку ОС / компилятора, просто разные объемы системной памяти.

Нет. До тех пор, пока вы сами этого не сделаете. Вы можете изменять размеры стека с помощью переключателей компилятора.

ld --stack=<STACK_SIZE>

или

gcc -Wl,--stack=<STACK_SIZE>

Стандарт C ++ принимает проблему стеков и куч:

Стандарт основан на абстрактной машине и на самом деле не касается аппаратных средств, стеков или куч. Это говорит о выделенном магазине и бесплатном магазине. Бесплатный магазин - это то, где вы были бы, если вы звоните новым (в основном). FWIW, реализация может иметь только одну область памяти, маскирующуюся как под стек, так и под кучу, когда дело доходит до размещения объектов.

Поэтому ваш вопрос сводится к проблеме, связанной с реализацией, а не к языковой проблеме.

Надеюсь, это поможет.

3 голосов
/ 25 марта 2009

В Linux (Ubuntu) операционная система контролирует максимальный размер. Для справки см. «Man limit» или «man ulimit».

2 голосов
/ 25 марта 2009

В настоящее время правильный вопрос таков: сколько памяти выделено моему потоку. Каждый поток получает количество, которое обычно можно контролировать во время создания потока.

Чтобы ответить на часть 1, компилятор / система потоков может выбрать, хотя некоторые ОС (исторически) имели ограничения.

Для 2 нет, это не масштабируется.

0 голосов
/ 25 марта 2009

Нет способа сделать это мобильно - стандарт C ++ на самом деле не требует стека.

...