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

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

Возникает вопрос: а почему бы функциям не возвращать объекты в стек? В «машинный», наверное, не получится, но в программный — вполне. Программный стек требует бо́льших накладных расходов, но давайте сначала разберёмся, чего мы хотим, а потом подумаем, как это сделать.

            Разбираться начнём с рассмотрения механизма передачи параметров и возврата значений в функциях, и почему это препятствует возврату значений переменной длины. Рассмотрим пример (в этом и всех последующих примерах рассмотрен вариант для C++, для x86, в режиме 32 бита):

  f2(<параметры f2>) {  // определение f2
    <локальные переменные f2>
    ...
  }
  f1(<параметры f1>) {  // определение f1
    <локальные переменные f1>
    f2(<параметры f2>); // вызов f2
  }
  f1(<параметры f1>);   // вызов f1
            Память в стеке при вызове этих функций будет распределена так:
Размещение объектов в стеке, традиционный подход
            Если стоит задача передать в функцию f1 из функции f2 объект, чья длина становится известной только при вызове f2, то как это сделать?

            Первый способ: записать его в стек ниже локальных объектов функции f2. Это плохая идея: весь фрагмент стека, принадлежащий функции f2 станет бесполезным пространством. Использовать его больше нельзя, т.к. при вызове других функций локальные данные этих функций могут затереть результат работы f2.

            Второй способ: записать его в стек ниже локальных объектов функции f1. В этом случае будут затёрт фрагмент стека функции f2, которая, скорее всего, утеряет даже адрес возврата. Однако, отметим себе такую возможность: в дальнейшем мы к ней вернёмся. Читаем далее следующую статью: Размещение объектов переменной длины с использованием множества стеков.

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

Опубликовано: 2014.07.27, последняя правка: 2018.10.29    16:03

ОценитеОценки посетителей
   ██████████ 2 (22.2%)
   ██████████ 2 (22.2%)
   ██████████████ 3 (33.3%)
   ██████████ 2 (22.2%)

Отзывы

✅  2016/08/09 04:50, rst256          #0 

Задача сформулирована слишком узко, в реальности в большинстве случаев будет вот так:
  f2(<параметры f2>) { ... }
f1(<параметры f1>) { ... f2(<параметры f2>); }
f0(<параметры f1>) { ... f2(<параметры f2>); }
some(const <параметры some>);
some2(const <параметры some2>);
foo(<параметры foo>) { x=f2(<параметры f2>); some(x); return x; }
bar(<параметры bar>) { some2(foo(<параметры foo>)); }

f0(<параметры f0>);
f1(<параметры f1>);
x=foo(<параметры foo>);
bar(<параметры bar>);
Вот почему никто ИМЕННО ТАКИМ способом значения не возвращает. Какой смысл делать возможность получить значение в локальную область вызывающей функции, если надо получить значение в "туда, куда надо в данном случае"?
Например, напишу я таким образом аналог функции strcat. И кому будет такой strcat нужен?

Добавить свой отзыв

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

Авторизация

Регистрация

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

Карта сайта


Содержание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

●●  Помеченные комментарии

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

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

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

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

●  Циклы

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

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

●  Изменение приоритетов операций

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

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

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

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

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

●●  О неправомерном доступе к памяти через указатели

●  Обработка ошибок

●  Функциональное программирование

●●  Нечистые действия в чистых функциях

●●  О чистоте и нечистоте функций и языков

●●  Макросы — это чистые функции, исполняемые во время компиляции

●●  Хаскелл, детище британских учёных

●●  Измеряем замедление при вызове функций высших порядков

●●  C vs Haskell: сравнение скорости на простом примере

●●  Уникальность имён функций: за и против

●●  Каррирование: для чего и как

●●  О тестах, доказывающих отсутствие ошибок

●  Надёжные программы из ненадёжных компонентов

●●  О многократном резервировании функций

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

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

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

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

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

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

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

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

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

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

●●  Изменение длины объекта в стеке во время исполнения

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

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

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

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

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

●  Реализация параметрического полиморфизма

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

Компилятор

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

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

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

Новости и прочее




Последние отзывы

2024/10/15 22:49 ••• Неслучайный читатель
Русский язык и программирование

2024/10/14 18:05 ••• MihalNik
Энтузиасты-разработчики компиляторов и их проекты

2024/10/01 09:36 ••• Иван
О русском ассемблере

2024/09/30 00:08 ••• Автор сайта
Новости и прочее

2024/09/29 23:40 ••• Автор сайта
Десятка худших фич C#

2024/09/29 13:10 ••• Автор сайта
ЕС ЭВМ — это измена, трусость и обман?

2024/09/22 21:08 ••• Вежливый Лис
Бесплатный софт в мышеловке

2024/09/05 17:44 ••• Автор сайта
Правила языка: алфавит

2024/09/04 00:00 ••• alextretyak
Циклы

2024/09/02 22:24 ••• Автор сайта
Постфиксные инкремент и декремент

2024/08/26 00:37 ••• Автор сайта
Что нового с 1966 года?

2024/07/26 13:32 ••• Бурановский дедушка
Программирование исчезнет. Будет дрессировка нейронных сетей

2024/06/21 00:20 ••• Gudleifr
О превращении кибернетики в шаманство