Переопределение новых и удаление для структур DirectX

0

Я следую обычному руководству DirectX в Интернете, в котором представлены классы и структурирование. Мне нужно выделить память для XMVECTOR и XMMATRIX из-за конкретной проблемы с распределением памяти.

Теперь все работает, но я хочу сделать код чище. Вопрос: есть ли способ переопределить новые и удалить для этих структур (поэтому данные преобразования malloc и указателя скрыты словом "новый", аналогично удалению), и если да, то как?

Изменить 2014-07-11:

Комментарии до сих пор предлагали два пути решения проблемы путем:

1) с использованием класса-оболочки для структур и перегрузки/переопределения delete и new для класса-оболочки.

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

2) Использование XMFLOAT4 и подобных структур.

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

  • 0
    cprogramming.com/tutorial/operator_new.html
  • 0
    @PawełStawarz PawełStawarz Нет, не совсем. Я не писал эти структуры (очевидно), поэтому я понятия не имею, как все это связано друг с другом. Сценарий слишком специфичен, чтобы вывести его из общего объяснения. Это структуры или классы? разница в переопределении? Это вообще возможно для конструкций? Какой из них должен быть перегружен? Где? и тд и тп
Показать ещё 18 комментариев
Теги:
memory-management
direct3d

1 ответ

1

Общая рекомендация - использовать различные структуры памяти (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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню