Прозрачный номер C ++ / Int Wrapper - PullRequest
1 голос
/ 11 июля 2011

Я создал класс для работы с битами для unsigned int (8, 16, 32 ...), и я пытался сравнить его с простыми битовыми операциями, но получил точный тест скорости побитовые операции сложны по меньшей мере. Причина обертки в том, что она намного менее сложна в использовании.

Теперь, хотя это может быть более академически полезным, чем практически, я хотел бы знать, возможно ли сделать класс, обертывающий вокруг int, настолько прозрачным, что это похоже на работу с int напрямую (со всеми возможными операторами ) за исключением функций, которые позволяют мне манипулировать им определенным образом и, если это возможно, быть настолько быстрыми (с большим количеством вставок).

Я в порядке, чтобы использовать все без исключения функции C ++ 0x для достижения этой цели.

Ответы [ 3 ]

2 голосов
/ 11 июля 2011

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

Насколько я знаю, было бы действительно возможно заставить его вести себя как int почти во всех отношениях.

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

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

1 голос
/ 11 июля 2011

Шаблоны

Кроме того, в чем сложность при профилировании ваших операций? Обычный способ - выполнить одну и ту же операцию X раз, а затем получить среднее значение. Если вы используете процессор Intel, вы можете прочитать таймеры процессора до и после каждой операции, а затем получить среднее значение, которое имеет некоторые недостатки, но должно быть относительно хорошо для ваших целей

http://en.wikipedia.org/wiki/Time_Stamp_Counter

Кроме того, вы можете посмотреть на asm, который генерирует компилятор при использовании вашего класса, и посмотреть, есть ли области, где вы можете реорганизовать свой код, чтобы он мог лучше выполнять оптимизацию.

0 голосов
/ 11 июля 2011

Да, это возможно;но я думаю, что в долгосрочной перспективе вам будет проще просто написать несколько встроенных шаблонных функций, которые можно вызывать с различными аргументами int8 / int16 / etcТаким образом, вам не нужно беспокоиться о том, как обрабатывать передачу объектов вашего класса в функции, которые ожидают обычные целые числа, и наоборот.(Не то чтобы это тоже не выполнимо, но может быть проще, чтобы полностью избежать этой проблемы)

...