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

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

Наверняка большинство программистов при работе с языками более низкого уровня (типа Си) отмечало неудобство в пользовании функциями: функции с удовольствием возвращают значения простейших типов данных, но когда из функции надо возвратить что-то посложнее, то оказывается, что не всё так гладко. Строку — одну из простейших вещей — можно возвратить только через указатель на неё. Если размер строки не известен вовремя компиляции (что бывает весьма нередко), то строку помещают в динамическую память («кучу»), а возвращают указатель на неё. В языках типа PHP всё, казалось бы, проще: функции запросто возвращают строки: «return $string». Но за этой внешней простотой кроется всё та же «куча»: строка хранится именно в «куче» и работают с ней через указатель.

        С возвратом значений простейших типов всё понятно: функция помещает результат в регистр и возвращает управление. Функция может даже возвратить какую-то структуру (а она имеет фиксированную длину), но и это не решает главной проблемы языков со статической типизацией. Функции не умеют возвращать объекты, длина которых известна только в момент вызова функции. Но чем плоха практика размещения объекта переменной длины в динамической памяти? Да тем, что эти операции «дороги» и не всегда безопасны (см. Почему динамическое распределение памяти — это плохо).

        Читаем далее следующую статью: Типы переменного размера (dynamically sized types, DST) в языке Rust.

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

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

ОценитеОценки посетителей
   █████████████████████ 1 (50%)
   █████████████████████ 1 (50%)
   ▌ 0
   ▌ 0

Отзывы

     2016/04/03 03:42, rst256          # 

Для строчек есть strdup, и куча иных функций в т.ч. со сборкой мусора

     2016/04/03 15:11, Автор сайта          # 

Википедия:

strdup — нестандартная функция языка программирования Си, создающая копию указанной нуль-терминированной строки в куче (используя malloc) и возвращающая указатель на неё.

Вот именно, что в куче. Это же из пушки по воробьям. malloc — достаточно «дорогая» операция, и последующие статьи — как раз о том, как это сделать «дешевле».

     2016/08/07 10:46, rst256          # 

malloc неизбежен. Что мешает выделить через него кусок побольше и пользовать его аки стек? Всего то надо решить, какой объем ему установить или предусмотреть способы расширения или фрагментации. А если "возвращать" по значению, то как быть, если объект надо выше по цепочке вызовов передать? Его же содержимое придется через каждую функцию по цепочке тянуть по стеку вверх, копируя его содержимое. Особенно веселым представляю довольно распространенный случай, когда объект таки нужно длительное время хранить в памяти и последнее копирование, которое ему придется перенести, будет копирование на блок, выделенный из кучи :-)

Я внимательно изучил все статьи автора с пользу стека против кучи. Техническая сторона вопроса там хорошо проработана, но я не увидел там ни одного слова об синтаксисе связанном, с хранением объектов в стеке. Такое чувство, что там всё полностью будет автоматизированно. Значит, работать будет чуть хуже, чем malloc, у которого хотя бы есть один параметр (размер выделяемого блока). Как минимум требуется указать время жизни объекта, т.е. в каком месте стека будет он расположен

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

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

Авторизация

Регистрация

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

Карта сайта


Содержание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

●  Циклы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Компилятор

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

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

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

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




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

2024/04/23 15:57 ••• Ivan
Энтузиасты-разработчики компиляторов и их проекты

2024/04/23 00:00 ••• alextretyak
Признаки устаревшего языка

2024/04/21 00:00 ••• alextretyak
Постфиксные инкремент и декремент

2024/04/20 21:28 ••• Бурановский дедушка
Русский язык и программирование

2024/04/07 15:33 ••• MihalNik
Все языки эквивалентны. Но некоторые из них эквивалентнее других

2024/04/01 23:39 ••• Бурановский дедушка
Новости и прочее

2024/04/01 23:32 ••• Бурановский дедушка
Русской операционной системой должна стать ReactOS

2024/03/22 20:41 ••• void
Раскрутка компилятора

2024/03/20 19:54 ••• kt
О многократном резервировании функций

2024/03/20 13:13 ••• Неслучайный читатель
Надёжные программы из ненадёжных компонентов

2024/03/07 14:16 ••• Неслучайный читатель
«Двухмерный» синтаксис Python

2024/03/03 16:49 ••• Автор сайта
О неправомерном доступе к памяти через указатели

2024/02/28 18:59 ••• Вежливый Лис
Про лебедей, раков и щук