С++: Инструментиране на методи генерирани от компилатора

Всичко за програмирането на игри - архитектура, графика, звук, изкуствен интелект, мрежи.
ikolev
модератор
модератор
Мнения: 1657
Регистриран: 20 ное 2003 22:39
Местоположение: София
Контакти:

С++: Инструментиране на методи генерирани от компилатора

Мнение от ikolev » 24 апр 2018 00:10

Ситуация:

Имаме тлъст клас пълен с много vector-и и много скаларни членове, който разчита на дефолтните copy ctor и assignment op.
Искаме да видим колко често се викато въпросните генерирани от компилатора методи, понеже са тежки и отнемат време.
Писането на ръчен operator= е много неудобно и безперспективно решение (нито искаме да пишем десетки присвоявания, нито утре някой да счупи класа като добави нов член и забрави да го копира).
Индустриален профайлер върши работа, само че от една страна не е много удобен и лесен за ползване, а от друга (по-важна) искаме не само да получим и да използваме информацията еднократно, а да я вкараме в автоматичен тест и да се подсигурим че постигнатата оптимизация (като брой извиквания) не се влошава.

Не много приятно решение:

Преименуваме въпросния клас, което не е много трудно (малко ръчен find-replace в хедъра, find-replace-all в .cpp-то на MyClass:: с MyClassRaw::). За по-сигурно правим конструкторите protected. После добавяме наследен клас с оригиналното име и operator= който вика operator= на базовия клас, и го инструментираме (демек добавяме статичен брояч на извикванията).
Не е много приятно заради развалянето на четливостта, оригиналният клас (който е имал най-подходящото възможно име) вече има неестествено име. Но поне клиентите ползват класа с оригиналното име.

Въпрос:
Дали пък няма по-добро решение? Не ми се вярва, но да питам все пак. Ако можеше някак хем да се подмени, хем да се използва компилаторно-генерираният метод...
И дали не е нахално да предложи човек нещо такова на хората дето развиват езика? :)

Мета-въпрос:
Има ли по-добро място където да се зададе такъв въпрос (бих казал, от сравнително високо ниво)? Stackoverflow май само ми звучи приемливо, но досега не съм питал там. За тук се надявам че pdimov още влиза от време на време :)

Потребителски аватар
themean
Power User
Power User
Мнения: 860
Регистриран: 02 дек 2010 22:51

Re: С++: Инструментиране на методи генерирани от компилатора

Мнение от themean » 24 апр 2018 22:00

Гаранция не съм разбрал въпроса, но към всеки клас може да се добави обект брояч който да се включва с макро дефинирано в билд системата.
Обекта ще може отделно да брои конструктори, копи конструктори и приравнявания. Няма нужда от преименувания и може с макро да се изключва за релииз. Нещото се постига с обявяване на калс с необходимия брой каунтери, нужните оператори и макро за деклариране. Като макрото може да добавя и методи за достъпване също така не трябва да прави нищо ако няма дефиниран дефайн в билд системата

ikolev
модератор
модератор
Мнения: 1657
Регистриран: 20 ное 2003 22:39
Местоположение: София
Контакти:

Re: С++: Инструментиране на методи генерирани от компилатора

Мнение от ikolev » 24 апр 2018 23:53

Аз пък не мога да разбера твоята идея.

Целта е всичкият останал код (хич не малко) да не трябва да се пипа, а да продължи да използва MyClass. Всъщност целта е да се пипа колкото може по-малко код :)
Може би имаш предвид да се подмени оригиналният клас с "#define MyClass MyClassInstrumented"? А какво ще бъде MyClassInstrumented? Ще трябва да прави всичко което прави оригиналът, с малко екстри. Класически случай на това което наричат Aspect-oriented programming. На мен най-лесно ми се видя с наследяване (ако новият клас съдържа оригинала, ще трябва да обвие целия му публичен интерфейс).
От всичко това нямаше да има нужда ако трябваше да инструментирам обикновен метод който си има тяло. Просто добавям брояча в началото на метода. Но присвояването няма тяло.

Release не е проблем, напротив, броячът трябва да работи в Release (и даже ще остане в билда за клиента, макар че едва ли ще се ползва). Методът е бавен и увеличаването на един брояч не пречи.

ikolev
модератор
модератор
Мнения: 1657
Регистриран: 20 ное 2003 22:39
Местоположение: София
Контакти:

Re: С++: Инструментиране на методи генерирани от компилатора

Мнение от ikolev » 26 апр 2018 10:01

Май съм изглупял нещо, подходящото решение е много просто. Скриваме operator= (protected) и добавяме метод assign който го вика и вдига брояча. Не е особен проблем клиентите да викат assign вместо op=, местата не са твърде много и компилаторът ще ги посочи. Копи-конструкторът може да вика assign за да се включи в статистиката.
Съжалявам за спама.

Потребителски аватар
iboB
Power User
Power User
Мнения: 113
Регистриран: 09 фев 2006 13:36
Местоположение: София
Контакти:

Re: С++: Инструментиране на методи генерирани от компилатора

Мнение от iboB » 29 юни 2018 16:42

А не е ли най-лесно да добавиш един нов член на класа който да кръстиш counter и в НЕГОВИТЕ copy/move/op= функции написани от теб да броиш нещата, които те интересуват?

ikolev
модератор
модератор
Мнения: 1657
Регистриран: 20 ное 2003 22:39
Местоположение: София
Контакти:

Re: С++: Инструментиране на методи генерирани от компилатора

Мнение от ikolev » 29 юни 2018 16:51

Интересно. На вложения член обаче ще му трябва достъп до данните на обхващащия клас, за да ги включи в статистиката. Значи ще трябва да държи указател към него. Може би ще стане и май ще е малко по-чисто, може да пробвам.

Отговори