Каким должен быть язык программирования? Анализ и критика Описание языка Компилятор
Отечественные разработки 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, которая, скорее всего, утеряет даже адрес возврата. Однако, отметим себе такую возможность: в дальнейшем мы к ней вернёмся. Читаем далее следующую статью: Размещение объектов переменной длины с использованием множества стеков.

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

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

ОценитеОценки посетителей
   ▌ 0
   ▌ 0
   ▌ 0
   ▌ 0

Отзывы

     2016/08/09 04:50, rst256

Задача сформулирована слишком узко, в реальности в большинстве случаев будет вот так:
  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++

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Компилятор

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

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

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

Прочее

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

2018/10/11 22:29, Автор сайта
Формула расчета точности для умножения

2018/10/08 14:00, Неслучайный читатель
Сколько проходов должно быть у транслятора?

2018/10/06 12:19, Автор сайта
Тексто-графическое представление программы

2018/10/04 17:39, Автор сайта
Об исключенных командах или за что «списали» инструкцию INTO?

2018/09/29 16:52, Автор сайта
Как отличить унарный минус от бинарного

2018/09/22 20:13, Д.Ю.Караваев
Идеальный транслятор

2018/09/22 12:32, Автор сайта
Типы в инженерных задачах

2018/09/22 12:20, Д.Ю.Караваев
О русском языке в программировании