Безопасность и размещение объектов переменной длины в стеке
Трюки со сдвигом указателя вершины стека, переключения с родного стека
на зарезервированный участок памяти под другой стек проводились с компилятором MSVC.
Глубокого изучения безопасности такого подхода не было.
Потенциальые проблемы видятся в следующем.
|
-
Обработка исключений. Не уверен, что все будет гладко.
Дело в том, что при обработке исключений производится обратная раскрутка стека.
И хотя адреса возвратов мы не трогали, но мало ли… Но мы разрабатываем новый язык,
и у нас будет собственная поддержка исключений, со стеками и их раскрутками.
Даже если будет использоваться тот же MSVC в качестве ассемблера высокого уровня.
-
Исчерпание стека. Когда в стеке размещали объекты фиксированной длины, а всё прочее — в «куче»,
то надо было умудриться исчерпать память в стеке.
Но мы хотим сделать стек основным местом хранения данных.
Поэтому под стек надо выделять достаточно количество памяти.
-
Уничтожение объектов по ходу работы подпрограммы.
Любые объекты, созданные в «куче», могут быть уничтожены в любое время в любом порядке,
лишь бы это не противоречило логике программы.
Для объектов, созданных в стеке, это не так.
Объекты в стеке должны уничтожаться в порядке, обратном их созданию.
В противном случае «утилизированная» память не может быть использована,
для новых объектов будет выделены новые участки памяти, что грозит её исчерпанием.
-
Уничтожение объектов по окончании работы подпрограммы.
Всё, что хранится в стеке, уничтожается простым сдвигом указателя вершины стека.
Для объектов, у которых деструктор определён, сначала должен вызываться деструктор,
и лишь в конце — сдвиг вершины стека.
Читаем далее следующую статью:
Массивы, структуры, типы, классы переменной длины.
Почитайте ещё:
Опубликовано: 2014.07.27, последняя правка: 2018.10.29 15:50
Отзывы
✅ 2015/02/11 13:10, Павел #0
Сравнивать "свой корректно работающий диспетчер «кучи». Чтоб была поддержка «умных указателей», подсчёт ссылок, корректное удаление ссылающихся друг на друга объектов, перемещение объектов с изменением указателей на них для устранения фрагментации" и "командами «PUSH <param>» «ADD ESP,4»" некорректно, т.к. это разные задачи.✅ 2015/02/11 18:00, Автор сайта #1
Конечно, куча — весьма универсальное решение. Но очень часто можно обойтись стеком, и стоит это три копейки. Конечно, сравнивать автомобиль и велосипед некорректно, но нередко в булочную лучше проехать на велосипеде, а не на такси.✅ 2016/11/06 09:20, rst256 #2
Конечно, сравнивать автомобиль и велосипед некорректно, но нередко в булочную лучше проехать на велосипеде, а не на такси. С молоком сравнение точнее будет: только применительно к данной ситуации нужно учесть что мы не знаем как далеко молочной (где будут нужны эти данные) и надо ли нам брать свою тару (выделять память самому из писать в уже выделенную по переданному указателю). Добавить свой отзыв
Написать автору можно на электронную почту mail(аt)compiler.su
|