Каким должен быть язык программирования? Анализ и критика Описание языка Компилятор
Отечественные разработки Cтатьи на компьютерные темы Компьютерный юмор Прочее

Безопасность и размещение объектов переменной длины в стеке

Трюки со сдвигом указателя вершины стека, переключения с родного стека на зарезервированный участок памяти под другой стек проводились с компилятором MSVC. Глубокого изучения безопасности такого подхода не было. Потенциальые проблемы видятся в следующем.
Безопасность и размещение объектов переменной длины в стеке

  • Обработка исключений. Не уверен, что все будет гладко. Дело в том, что при обработке исключений производится обратная раскрутка стека. И хотя адреса возвратов мы не трогали, но мало ли… Но мы разрабатываем новый язык, и у нас будет собственная поддержка исключений, со стеками и их раскрутками. Даже если будет использоваться тот же MSVC в качестве ассемблера высокого уровня.
  • Исчерпание стека. Когда в стеке размещали объекты фиксированной длины, а всё прочее – в «куче», то надо было умудриться исчерпать память в стеке. Но мы хотим сделать стек основным местом хранения данных. Поэтому под стек надо выделять достаточно количество памяти.
  • Уничтожение объектов по ходу работы подпрограммы. Любые объекты, созданные в «куче», могут быть уничтожены в любое время в любом порядке, лишь бы это не противоречило логике программы. Для объектов, созданных в стеке, это не так. Объекты в стеке должны уничтожаться в порядке, обратном их созданию. В противном случае «утилизированная» память не может быть использована, для новых объектов будет выделены новые участки памяти, что грозит её исчерпанием.
  • Уничтожение объектов по окончании работы подпрограммы. Всё, что хранится в стеке, уничтожается простым сдвигом указателя вершины стека. Для объектов, у которых деструктор определён, сначала должен вызываться деструктор, и лишь в конце – сдвиг вершины стека.
            Читаем далее следующую статью: Массивы, структуры, типы, классы переменной длины.

Почитайте ещё:

Последняя правка: 2016-03-18    09:42

Оцените

Отзывы

     2015/02/11 13:10, Павел

Сравнивать "свой корректно работающий диспетчер «кучи». Чтоб была поддержка «умных указателей», подсчёт ссылок, корректное удаление ссылающихся друг на друга объектов, перемещение объектов с изменением указателей на них для устранения фрагментации" и "командами «PUSH <param>» «ADD ESP,4»" некорректно, т.к. это разные задачи.

     2015/02/11 18:00, Автор сайта

Конечно, куча – весьма универсальное решение. Но очень часто можно обойтись стеком, и стоит это три копейки. Конечно, сравнивать автомобиль и велосипед некорректно, но нередко в булочную лучше проехать на велосипеде, а не на такси.

     2016/11/06 09:20, rst256

Конечно, сравнивать автомобиль и велосипед некорректно, но нередко в булочную лучше проехать на велосипеде, а не на такси.

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

Написать отзыв

Написать автору можно на электронную почту mail(аt)compiler.su

Авторизация

Регистрация

Выслать пароль

Карта сайта


Каким должен быть язык программирования?

Анализ и критика

Устарел ли текст как форма представления программы

Русский язык и программирование

Многоязыковое программирование

Синтаксис языков программирования

Синтаксический сахар

Некоторые «вкусности» Алгол-68

«Двухмерный» синтаксис Python

Почему языки с синтаксисом Си популярнее языков с синтаксисом Паскаля?

Должна ли программа быть удобочитаемой?

Стиль языка программирования

Тексто-графическое представление программы

●  Разделители

●  Строки программы

●  Слева направо или справа налево?

Комментарии

●  Длинные комментарии

●  Короткие комментарии

●  Комментарии автоматической генерации документации

●  Нерабочий код

Нужны ли беззнаковые целые?

Шестнадцатиричные и двоичные константы

Условные операторы

Переключатель

Циклы

●  Продолжение цикла и выход из него

Некошерный «goto»

Операции присвоения и проверки на равенство. Возможно ли однаковое обозначение?

Так ли нужны операции «&&», «||» и «^^»?

Постфиксные инкремент и декремент

Почему в PHP для конкатенации строк используется «.»?

Указатели и ссылки в C++

Использование памяти

Почему динамическое распределение памяти – это плохо

Как обеспечить возврат функциями объектов переменной длины?

●  Типы переменного размера (dynamically sized types, DST) в языке Rust

●  Массивы переменной длины в C/C++

●  Размещение объектов в стеке, традиционный подход

●  Размещение объектов переменной длины с использованием множества стеков

●  Размещение объектов переменной длины с использованием двух стеков

●  Реализация двухстековой модели размещения данных

●  Двухстековая модель: тесты на скорость

●  Размещение объектов переменной длины с использованием одного стека

Можно ли забыть о «куче», если объекты переменной длины хранить в стеке

Безопасность и размещение объектов переменной длины в стеке

Массивы, структуры, типы, классы переменной длины

О хранении данных в стеке, вместо заключения

Описание языка

Компилятор

Отечественные разработки

Cтатьи на компьютерные темы

Компьютерный юмор

Прочее

Последние комментарии

2018/07/03 03:27, rst256
Философия языка

2018/06/25 15:10, Автор сайта
Продолжение цикла и выход из него

2018/06/14 00:37, rst256
Лень — двигатель прогресса

2018/05/31 18:52, rst256
Программирование без программистов — это медицина без врачей

2018/05/31 17:57, rst256
Циклы

2018/05/31 17:50, Comdiv
Разбор цепочек знаков операций

2018/05/31 17:42, Comdiv
Как отличить унарный минус от бинарного

2018/05/30 18:57, Александр Коновалов aka Маздайщик
Раскрутка компилятора