nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Всё это уже было в Симпсонах?

Мне что-то в последнее время стали на YouTube предлагать доклады с CPPcon. Когда-то я в институте изучал C++, чуть-чуть немножко довелось на нём поковыряться, а по работе имею дело с "чистым" C (для всяких вычислителей), и немножко с программами рабочего места, которые тут были написаны в Borland C++ Builder.

И что-то я немножко в офиге от того, что вижу: вещи, которые Борланд решил ещё тогда, 20 лет назад, только сейчас очень осторожно и с кучей матов пытаются внедрить в стандарт...


Один доклад по поводу того, как бы так избежать бессмысленного копирования строк:


До сих пор работа со строками вызывает попоболь! Но извольте, в том же Борланде (и Delphi, и C++) была замечательная строка с подсчётом ссылок и Copy-on-Write. В том примере, который докладчик мучает в течение часа, использование старых ANSIstring "в лоб" позволило бы вообще обойтись без выделения памяти! Ну потому как мы передаём лишь указатель, и присваиваем один указатель другому, и пока мы не пытались модифицировать данные, выделять память не требуется - она уже была выделена для всех "литералов". А поставишь аргумент функции const - он и счётчик ссылок не будет лишний раз прибавлять, а в конце функции вычитать - по сути нулевой overhead.

Я так понимаю, std::string некоторое время работал точно так же, но к С++11 их заставили выкинуть оттуда методику Copy-on-Write, т.к в моде стала многопоточность, а значит, надо ставить всякие крит. секции на счётчик ссылок, а это системные вызовы, поэтому нафиг. Не вполне понимаю эту логику - в любом случае "конкурентное" обращение к одной строке, кем-то на запись, кем-то на чтение - это рискованно! Заявили бы очередное UB - и дело с концом...

Теперь каждый раз присвоение одной строки другой приводит к полному копированию, так что хочешь быстрый код - будь добр ручками!


Доклад насчёт того, как бы здорово было бы сделать в C++ хотя бы небольшую рефлексию (reflection, introspection, RTTI), которая позволит легко исполнить сериализацию/десериализацию, Dependency injection, не плодить "фабрики" и т.д. (при этом не закопавшись по уши в темплейтах):


Возражение то же самое: всё это уже было в Борланде :) Весьма специфическая система, изначально заточенная именно под визуальное программирование, но очень мощная! С восстановлением указателей объектов друг на друга, с автоматическим созданием необходимых экземпляров классов "на лету", с преобразованием числовых значений enum в символьные (ровно так, как оно определено в программе), и пр.

Грубо говоря, каждый визуальный компонент был не чем иным, как классом. Определил его, задал как обычно private, protected и public-поля, а потом ещё и published - те, которые должны отображаться в инспекторе объектов, и которые должны сохраняться в файл и загружаться из файла. И когда "кидаешь" на форму всякие кнопочки, поля, вкладки и пр. - это не требовало написания ни одной строки кода! В смысле, что Qt (к примеру) генерится ещё один cpp-файл, где создаваются все компоненты и связываются друг с другом. А здесь создаётся только форма - и тут же загружается из ресурсов. Т.е класс формы ещё не знал, какие именно компоненты на неё "кинут", и где они будут размещены, и как связаны между собой. Всё это делается, по сути, в рантайме - при чтении ресурса он находит имена классов, создаёт соотв. экземпляры, заполняет их нужными значениями, организует их в иерархическую структуру со "слабыми" ссылками между собой (и Toolbar, и ImageList принадлежат форме, но Toolbar содержит указатель на ImageList, который также "восстанавливается" из файла).

Я когда-то игрался с этим делом - реализовывал древовидное Undo с сохранением в файл проекта, и горя не знал :)

Такое ощущение, что история в очередной раз идёт по спирали.
Tags: программки, странные девайсы
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 25 comments