Search
Write a publication
Pull to refresh
1
0
Китаев Антон @Notevil

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

Send message

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

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

Я это утверждение не понял. 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?

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

А я не понял как это работает. Если специализация идет не изнутри класса, то разве взятие адреса приватной переменной доступно? Адрес берется для инстанцирования шаблона, но в начале статьи ведь упоминалось, что нельзя взять адрес приватной переменной.

template struct init_member<Dog, string, &Dog::name>;

Шаблоны в C++ инстанцируются на этапе компиляции, и если специализация шаблона происходит в контексте, где приватный член доступен (например, внутри класса или через friend), то компилятор разрешит взять его адрес

В коде я не вижу ни "внутри класса" ни "friend".

А вот такое оно сможет переварить?

class Foo{
  private:
    int a;
    int b;
    std::string& c;
};

Вообще я сам игрался с указателями на поля члены, делал на этом сериализацию. Для меня стали проблемой обращение к полям ссылкам и базовому классу.
Код есть тут (с++17):
https://github.com/aethernetio/aether-client-cpp/blob/main/aether/reflect/reflect.h
Много пришлось подмазать макросами. Ну и в моем случае необходимость менять класс это фича, а не проблема.

Подумал было, что это уже должно работать в стандартном `std::tuple`, но как оказалось оно implementation defined. Плюс для msvc EBO оказывается нужно включать специально.
Пример https://godbolt.org/z/dhEGfqnbz

А статья есть про это?

У меня вопрос про [[no_unique_address]]
А нет ли в компиляторах реализации своих кастомных атрибутов для до c++20 эпохи, так чтобы я мог наделать макросов и использовать [[no_unique_address]] фичу в c++17?

Про шаблоны уберу.

https://godbolt.org/z/Eh53TGc5e это и аргументами функции работает

Про область видимости не совсем так.
Обратите внимание https://godbolt.org/z/YTM1Kzq8r
class X и Y объявляю внутри Foo, но X в той же области видимости что и Foo, а Y в области видимости внутри Foo.

Сам когда-то увидел в каком-то виде с cppcon. Не мог найти примеры и как это называется. Пришлось чатгпт мучать.

Есть еще вот такая штука
https://stackoverflow.com/questions/37744047/class-declaration-inside-function-parameter-list?utm_source=chatgpt.com

И можно например написать вот так

std::unique_ptr<class X> x_ptr;

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

Ну звучит как достаточно важная оптимизация, но потенциально время самого GetBufLen может ее нивелировать.

1

Information

Rating
6,008-th
Location
Уфа, Башкортостан(Башкирия), Россия
Date of birth
Registered
Activity