Обновить
2
0
Китаев Антон @Notevil

Инженер программист

Отправить сообщение

Сегодня не используется владение через указатель на базовый класс

Именно так
Ну и как тут уже упоминали

В embedded мире часто приходится жертвовать идиоматичностью и красотой кода ради соответствия жестким ограничениям по памяти или производительности

Поменяется код придется руками исправлять, забудешь исправить - сам дурак. Это же c++.

Для запуска Bloaty с отладочным файлом используется флаг --debug-file.

bloaty --debug-file=/path/to/debug_symbols_file /path/to/my_stripped_executable


А есть инструкция как этот правильно применяется? Допустим собрали вы свой проект с описанными флагами для оптимизации включая --strip-all, с gcc на линукс с cmake. Где искать `/path/to/debug_symbols_file` ?

Я у себя столкнулся с такой особенностью виртаульных таблиц.
У меня был код, который использовал базовый класс как интерфейс, но сами реализации не хранились в одном месте через указатель на этот базовый класс. Но сам базовый класс имел виртуальный деструктор, как советуют core гайды.
Удаление этого деструктора, сэкономило мне около 10К в бинарнике.
Утечек нет, потому что не используется владение через указатель на этот базовый класс и деструктор вызывается всегда сразу у потомка.

Ну нельзя же сам велосипед с таким двигателем. А велосипедист может хоть 10кВт выдавать если он такой супермен.

А есть опция использовать системно установленную библиотеку, и если ее нет, то свою, поставляемую?

А оно кроссплатформенное, на мак и виндовс эта схема будет так же работать?

Вчера только решил попробовать. Не было связи с сервером. Обидно.

А как управлять внешними зависимостями? Единый репозиторий пакетов, где все лежит в стандартизированном виде, или поддержка различных инструментов, как клонирование напрямую с git или штуки на подобии conan и vcpkg. А в каком виде? Так же в коде типо `import "https://github.com/fmtlib/fmt#master"`?

Можно ли это реализовать в новом компиляторе c++, который будет одновременно поддерживать стандарт и расширять его необходимыми фичами для самособираемости кода? С учетом модулей, возможно даже без нестандартных pragma можно будет уже собирать код с дефолтными флагами.

В даже в настоящее время проект - это просто папки и набор файлов в них с описанием того что нужно с этим сделать, вместо указания того, что нужно сделать непосредственно с их содержимым.

Я не понимаю разницу?
Или хочется чтобы, то как собирается приложение было сразу в исходном коде?

Извините за оффтоп и за критику, но не могу больше терпеть.
Часто вижу ваши комментарии, пишите интересные вещи, вроде бы, и по делу, вроде бы. Но они часто заминусованные. Причина, как мне кажется, это ваш стиль написания. Каждый комментарий как пережеванная каша из слов. Нужно несколько раз прочитать и все равно нет гарантии понимания.
И мне обидно, что из-за этого ваше мнение, кажется, остается не услышанным.

Мне кажется так однозначно говорить, что синтетика это синтетика, а полноценная демка будет работать по другому тоже не правильно.
Если в синтетике работает быстрее, то нужно просто понять почему. Может полноценная демка, сама по себе будет описана не оптимально без учета неких особенностей.

работать со значениями а не указателями

Я это утверждение не понял. AnyAny ведь внутри тоже будет использовать указатель?
на примере

struct Draw {
  template<typename T>
  static void do_invoke(const T& self) {
    self.draw();
  }
};

self это ссылка (читай указатель).

Эффективность тоже можно получить за счёт того что не выделяется память под маленькие объекты и что указатель на значение лежит не в объекте, а рядом с указателем на vtable, что позволяет их грузить одновременно, а не по очереди

До конца тоже не понял. Для классического полиморфизма не важно как и где выделяется память же, главное ссылку на объект заиметь.

Я наверное плохо читал, у AnyAny есть бенчмарки? Особенно интересно учитывая, что автор этой статьи сделал опровержение и эффективности все таки не обнаружено.

В статье упоминаются сторонние библиотеки типа c-ares. А в каком случае использовать их вместо getaddrinf()?
Мне в голову приходит только кросс платформенные приложения, чтобы не сильно разбираться, а что там резолвит в windows, и мобилках.

Я все таки не понял откуда повышение производительности тут. Только за счет того, что указатель на объект лежит рядом с указателем на VTable?
Если так смотреть, то это ведь все равно не прямой вызов методов. Плюс если компилятор где-то мог сделать девиртуализацию, то тут уже не сможет.

Если будет интересно в следующем посте напишу:

  1. ScopedEventHandler

  2. Реализацию без virtual

Так это еще не production ready реализация, а только прототип?

В своем проекте тоже столкнулся с надобностью ивентной системы и она у меня уже прошла несколько итераций. В общем идеи все те же что и в этой статье. Тоже может статью написать?
Для меня неожиданными моментами стали
- время жизни подписчика событие.
подписчик не должен переживать события и для этого нужна отписка в деструкторе. У меня для этого RAII объект Subscription.
- время жизни события.
при отписке от события нужно учитывать, что само событие может быть уже и не живо.
- во время диспатчинга события, уничтожается само событие.
У меня есть логика, которая по событию уничтожает и пересоздает объект владелец события. То есть диспатчинг события должен переживать само событие.
- рекурсия - во время обработки события, заэмиттили то же самое событие.
- ну про многопоточку понятно - если подписываться или отписываться во время диспатчинга события, может быть не очень хорошо.

Ну и по поводу реализации без virtual. Я по разному экспериментировал и пришел к тому, что у меня обработчик хранится в std::function. Можно искать и другие реализации, возможно более эффективные но скорее всего со своими ограничениями.

Статья то не про ассемблер, а про то как устроен машинный код.

Потому что это перевод!

Да нет, там в оригинале прямо написано std::string. То есть проблема не в переводе, а в первоисточнике.

не работает

У меня вопрос про конструкцию

alignas(A) char data[sizeof(A)];
A* a = std::launder(reinterpret_cast<A*>(data));

Если A не POD тип? Если он наследуется от какого-то Base который имеет свои поля, который наследуется от некоего IAbstract у которого есть виртуальные методы реализуемые в A. Какие могут быть проблемы в c++17?

Информация

В рейтинге
Не участвует
Откуда
Уфа, Башкортостан(Башкирия), Россия
Дата рождения
Зарегистрирован
Активность