Comments 15
Стек представляет собой специальную область памяти, которая автоматически управляется процессором. (...) Обычно существует ограничение на размер стека, которое может варьироваться в зависимости от операционной системы.
А почему и на каком уровне эта область памяти является "специальной": на аппаратном (управляется процессором), на уровне ОС (приводит к сигфолту), на уровне рантайма C++ (можно ли - не знаю, зачем - упороться и написать свой С++ без стэка, с одной кучей, чтоб вместо стекфреймов были кучефреймы)?
Конечно можно, не во всех архитектурах процессоров вообще есть стек.
В тех, где есть, это именно элемент архитектуры процессора? Типа, объявили: "Смотри, процессор, вот в памяти от сих до сих тебе стек, упровляй"?
Ну да. А что там управлять-то, указатель вершины и сегмент памяти (где есть).
специальный регистр для вершины стека и специальные команды. а в некоторых архитектурах даже окно для общих регистров, чтобы при вызове функции, не нужно было сохранять регистры, в тот же стек.
Обычно просто показывают адрес в скольки-то килобайтах от начала памяти приложения. Все что растёт вверх становится кучей, все что растёт к началу памяти - стеком. Собственно сказа про "увеличение размера стека" это как раз сдвиг этой точки подальше от начала пространства памяти пользователя.
Специальной она является на уровне ОС и возможно MMU (Memory Management Unit).
В обычных архитектурах есть регистр через который традиционно передается указатель на стек, и инструкции (push
, pop
) которые взаимодействуют с этим регистром. Но сам стек может распологаться в произвольном месте, определяемом ОС.
С точки зрения машинного кода программы обращение к стеку зачастую эквивалентно обращению к какому-то адресу (за исключением спец инстркуций).
C и С++ как языки не знают о стеке и куче, это детали реализации. В C++ есть storage duration, и переменные с automatic storage duration обычно хранятся на стеке, но они могут храниться напрямую в регистрах или вообще не быть материализованы. К куче доступ так или иначе производится через вызов системной функции, (обычно malloc) который может быть внутри operator new
, std::allocator
и т.п.
Не уверен что имел ввиду автор под "автоматически управляется процессором", но за исключением нескольких инструкций для процессора стек - обычная область памяти, состоянием стека управляет программа, а выделением и контролем - ОС.
А что такое вообще управление памятью? Выделение и освобождение. В случае аппаратного стека – уменьшение и увеличение процессорного регистра указателя стека, ничего больше.
При этом естественно, что без программы процессор ничего не делает, поэтому довольно сложно тут провести границу.
Зависит от архитектуры. В той же е2k (Эльбрусы) - там стек это сущности уровня процессора)
Ну может процессоры как то умеют принудительно размещать область стека в кэше и защищать эту область кэша от других данных.
мда... словно песок жуешь.
про C++ писать нужно легко и весело: https://ders.by/cpp/norefs/norefs.html
RVO начиная с C++17 обязателен.
Game++. Heap? Less