Я следую обычному руководству DirectX в Интернете, в котором представлены классы и структурирование. Мне нужно выделить память для XMVECTOR и XMMATRIX из-за конкретной проблемы с распределением памяти.
Теперь все работает, но я хочу сделать код чище. Вопрос: есть ли способ переопределить новые и удалить для этих структур (поэтому данные преобразования malloc и указателя скрыты словом "новый", аналогично удалению), и если да, то как?
Изменить 2014-07-11:
Комментарии до сих пор предлагали два пути решения проблемы путем:
1) с использованием класса-оболочки для структур и перегрузки/переопределения delete и new для класса-оболочки.
Проблема с этим - очевидное поражение производительности и необходимость доступа к структуре членов за один раз (менее чистый код, который поражает всю цель).
2) Использование XMFLOAT4 и подобных структур.
Проблема заключается в том, что это облегчает распределение памяти, но добавляет сложности в преобразованиях между типами (поскольку XMMATRIX и XMVECTOR являются теми, которые возвращаются функциями DirectXMath). Эти преобразования также делают код менее чистым, поэтому ему нравится заменять кучу собачьей кормы кошачьей коркой, она по-прежнему корчится в конце (да, лучшее сравнение, которое я мог придумать, чтобы передать смысл).
Общая рекомендация - использовать различные структуры памяти (XMFLOAT4 и т.д.) И Load/Stores. Если вы ориентируетесь только на x64, вы можете использовать XMVECTOR/XMMATRIX напрямую, поскольку по умолчанию платформа использует 16-байтную выровненную память.
Рекомендация перегрузки new/delete не предназначена для XMVECTOR или XMMATRIX. Скорее вы можете перегружать new/delete для своих классов, содержащих эти типы, для использования __aligned_malloc (x, 16). Глобальное переопределение нового/удаления возможно, но выполнение этого класса на самом деле является рекомендуемым решением. См. "Эффективные C++" книги Скотта Мейерса для подробного обсуждения переопределения new/delete.
Другой подход - использовать идиому pImpl, как это делает DirectX Tool Kit. Открытый класс не выравнивается, но внутренний класс использует __aligned_malloc (x, 16). Это действительно работает очень хорошо, и как реализация, так и клиентский код не выглядят "poop".
Наконец, вы можете использовать оболочку SimpleMath в DirectX Tool Kit, которая предоставляет классы, которые выводятся из XMFLOAT4 и т.д. С неявными преобразованиями. Это не так эффективно, но он выглядит чистым, не беспокоясь о проблемах выравнивания.
BTW, эта тема освещена в DirectXMath Programmer Guide на MSDN.