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

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

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

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

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

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

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

ОценитеОценки посетителей
   ▌ 0
   ██████████████████████████████████████████ 1 (100%)
   ▌ 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++

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

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

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

●  Типы переменного размера (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 Маздайщик
Раскрутка компилятора