Информация об изменениях

Сообщение v-table vs if call от 01.12.2022 4:58

Изменено 01.12.2022 5:08 maks1180

v-table vs if call
1) Что будет быстрее работать вызов через v-table или такая конструция через if () myfunc1() else myfunc2() или вызов через switch().
Как мне кажется (я не тестировал), но при вызове через v-table процессор не может предсказать адрес перехода и поэтому кэш будет чаще промахиваться.

2) Есть ли v-table у struct ? Если есть будет ли чем отличаться по производительности от v-table class ?

3) Подскажите приемлимое решение, есть сетевое приложение:
а) на каждое входящее соединение создаём объект класс ClientCommon и далее он отвечает за работу с этим соединением.
б) после общения с ним мы понимает кто он и должны создать заместо ClientCommon либо Client1 либо Client2

для этих классов я буду вызывать: функцию OnRecv() при получении данных для них и OnClose() при разрыве соединения.
Но код в этих функциях будет отличаться для ClientCommon, Client1, Client2.
Как это лучше реализовать ?

Как я вижу это сделать: объявляю union { ClientCommon, Client1, Client2 } вызываю сначала конструктор для ClientCommon,
потом нужно как-то на этом же месте в памяти создать объект Client1 или Client2 от ClientCommon. Как это сделать ? Вроде через "new" можно указать адрес памяти ?

Или лучше сделать через if else заместо v-table ? В этом случаи есть шанс что gcc проинлайнит все вызовы и будет быстрее работать.
v-table vs if call
1) Что будет быстрее работать вызов через v-table или такая конструция через if () myfunc1() else myfunc2() или вызов через switch().
Как мне кажется (я не тестировал), но при вызове через v-table процессор не может предсказать адрес перехода и поэтому кэш будет чаще промахиваться.

2) Есть ли v-table у struct ? Если есть будет ли чем отличаться по производительности от v-table class ?

3) Подскажите приемлимое решение, есть сетевое приложение:
а) на каждое входящее соединение создаём объект класс ClientCommon и далее он отвечает за работу с этим соединением.
б) после общения с ним мы понимает кто он и должны создать заместо ClientCommon либо Client1 либо Client2

для этих классов я буду вызывать: функцию OnRecv() при получении данных для них и OnClose() при разрыве соединения.
Но код в этих функциях будет отличаться для ClientCommon, Client1, Client2.
Как это лучше реализовать ?

Как я вижу это сделать: объявляю union { ClientCommon, Client1, Client2 } вызываю сначала конструктор для ClientCommon,
потом нужно как-то на этом же месте в памяти создать объект Client1 или Client2 от ClientCommon. ВАЖНО именно на этом же месте создать, так как ардес уже привязан в epoll.
Как это сделать ? Вроде через "new" можно указать адрес памяти ?

Или лучше сделать через if else заместо v-table ? В этом случаи есть шанс что gcc проинлайнит все вызовы и будет быстрее работать.