Pull to refresh

Comments 15

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

А почему и на каком уровне эта область памяти является "специальной": на аппаратном (управляется процессором), на уровне ОС (приводит к сигфолту), на уровне рантайма C++ (можно ли - не знаю, зачем - упороться и написать свой С++ без стэка, с одной кучей, чтоб вместо стекфреймов были кучефреймы)?

Конечно можно, не во всех архитектурах процессоров вообще есть стек.

В тех, где есть, это именно элемент архитектуры процессора? Типа, объявили: "Смотри, процессор, вот в памяти от сих до сих тебе стек, упровляй"?

Ну да. А что там управлять-то, указатель вершины и сегмент памяти (где есть).

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

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

Специальной она является на уровне ОС и возможно MMU (Memory Management Unit).
В обычных архитектурах есть регистр через который традиционно передается указатель на стек, и инструкции (push , pop) которые взаимодействуют с этим регистром. Но сам стек может распологаться в произвольном месте, определяемом ОС.
С точки зрения машинного кода программы обращение к стеку зачастую эквивалентно обращению к какому-то адресу (за исключением спец инстркуций).
C и С++ как языки не знают о стеке и куче, это детали реализации. В C++ есть storage duration, и переменные с automatic storage duration обычно хранятся на стеке, но они могут храниться напрямую в регистрах или вообще не быть материализованы. К куче доступ так или иначе производится через вызов системной функции, (обычно malloc) который может быть внутри operator new, std::allocator и т.п.
Не уверен что имел ввиду автор под "автоматически управляется процессором", но за исключением нескольких инструкций для процессора стек - обычная область памяти, состоянием стека управляет программа, а выделением и контролем - ОС.

А что такое вообще управление памятью? Выделение и освобождение. В случае аппаратного стека – уменьшение и увеличение процессорного регистра указателя стека, ничего больше.

При этом естественно, что без программы процессор ничего не делает, поэтому довольно сложно тут провести границу.

Зависит от архитектуры. В той же е2k (Эльбрусы) - там стек это сущности уровня процессора)

Ну может процессоры как то умеют принудительно размещать область стека в кэше и защищать эту область кэша от других данных.

Да ктож вам мешает. Хабр большой и уважаемый ресурс, аудитория у статьи будет, коменты тоже. Оно не всегда весело, особенно когда приходишь на легаси проект, который до тебя попрогали не одна сотня людей.

Он конечно обязателен, но есть нюансы

Sign up to leave a comment.

Articles