Затраты на использование классов для матрицы алгебраических структур в C ++ - PullRequest
6 голосов
/ 24 декабря 2010

Я использую C ++ для кодирования какого-то сложного алгоритма FFT, поэтому мне нужно реализовать такие алгебраические структуры, как кватернионы и коды Гамильтона-Эйзенштейна. Алгоритм работает с 2D массивом этих структур. Каковы будут затраты на их реализацию в виде классов? Иначе, я должен создать массив с измерениями [M] [N], который состоит из классов Quaternion, или я должен создать массив [M] [N] [4] и работать с массивами [4] как кватернионы? Использование классов более удобно, но создание классов M * N и доступ к их методам вместо работы только с массивом - не будет ли это слишком большой нагрузкой? Я кодирую алгоритм обработки больших изображений, поэтому для меня важна производительность.

Ответы [ 2 ]

2 голосов
/ 24 декабря 2010

Относительно накладных расходов на классы: если у ваших классов нет виртуальных функций, штраф за использование классов не взимается.

Так, например, массив комплексных переменных может быть записан как:

std::complex<double> m[10][10];

Остерегайтесь классов коллекции STL, поскольку они, как правило, используют динамическое распределение и иногда приводят к значительным накладным расходам (т. Е. Я не буду создавать массивы с использованием vector< vector<> >.

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

2 голосов
/ 24 декабря 2010

ИМХО, вам лучше использовать их как классы просто потому, что это позволит вам писать код быстрее и с меньшим количеством ошибок.Вы должны выполнить измерения, чтобы увидеть, что работает лучше всего, если это важно для вас, но также убедитесь, что именно этот код является узким местом производительности.(Обязательно Цитата Дональда Кнута : «преждевременная оптимизация - корень всего зла»).

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

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

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

...