Я нахожусь в процессе разработки математической библиотеки. Я хочу начать с простого вектора 4 и матрицы 4x4, и я буду расширять его по мере необходимости. Я пытаюсь за и против нескольких дизайнов, которые я видел, чтобы я мог выбирать. Я нахожу это разочаровывающим, я много искал, я нашел много, но почти не отвечал на вопрос об эффективности дизайна, который имеет решающее значение для математической библиотеки.
То, что я принимаю во внимание, компилятор теперь потрясающий, я знаю, что не могу быть умнее этого компилятора, но я хочу помочь ему по максимуму. C ++ 11 приносит хорошие вещи, такие как семантика перемещения и другие вещи, такие как std :: tuple ....
Из того, что я знаю, данные должны храниться в непрерывной памяти.
Где я немного потерялся и мне нужно больше информации:
А) Должны ли данные быть:
value_type [Rows * Cols] (простой массив c) или
value_type * (размещается в куче размером Rows * Cols) или использовать что-то вроде
станд :: кортеж
B) Также Наследование или состав / агрегация
Я мог бы иметь базовый класс шаблона для данных или сделать это с помощью композиции / агрегирования
C) Я видел 3 макета данных
D) Также в статье о gamasutra (которая кажется старой и компилятор лучше) Он говорит, что в классе не должно быть перегрузки операторов, и вместо этого следует использовать глобальную функцию. Например, функция crossProduct, чтобы сделать ее не членом вместо функции-члена.
У меня есть все эти вопросы, я знаю, что есть много. Как вы относитесь к ним, особенно к А и С.
Edit:
Спасибо всем за ответ на вопрос А, я должен сказать, что в данный момент мой самый большой вопрос связан с пунктом С, извините, я знаю, что это не ясно. Пункт с действительно о дизайне классов. Я видел 2 варианта (типа три, если вы рассматриваете этот статический трюк http://www.gamedev.net/topic/261920-a-slick-trick-in-c/), который я мог бы иметь для Vector4 в качестве примера, я мог бы иметь члены x, y, z и w общедоступными, или я мог бы также сделать союз с эти члены и массив, или я мог бы иметь только массив и иметь функции X (), Y (), Z (), W () для аксессора. И наконец, есть статический трюк, который я предоставил ссылку чуть выше, но я предпочел бы, чтобы x, y, z и w были статическими, а массив был бы членом данных.