matrix = * ((fxMatrix *) & d3dMatrix);//Злой? - PullRequest
1 голос
/ 03 января 2011

Я использую

matrix = *((fxMatrix*)&d3dMatrix);

довольно долго. Он работал нормально, пока мой экран не стал черным и не получил разочарование на моем столе.

fxMatrix содержит 4 fxVectors. Раньше fxVector составлял 16 байтов, но теперь он внезапно стал равным 20. Это произошло потому, что он унаследовал fxStreamable, который добавил vTable.

Таким образом, одно из решений, конечно, состоит в том, чтобы просто не наследовать fxStreamable, и оставить комментарий о том, что он всегда должен быть 16 байтов и никогда больше.

Другим решением было бы сделать функции преобразования и полностью скопировать матрицу. Это делает его более безопасным, но влияет на производительность. Я полагаю, это лучшая идея.

Другое решение - вообще не конвертировать и придерживаться D3DXMATRIX, но это делает двигатель несовместимым, и мне лично очень не нравится эта идея.

Каково ваше мнение?

Ответы [ 4 ]

4 голосов
/ 03 января 2011

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

3 голосов
/ 03 января 2011

Вы можете просто сделать оператор присваивания экспликации:

// Code Was this:
matrix = *((fxMatrix*)&d3dMatrix);

// Add the assignment operator
class fxMatrix
{
    // STUFF
    fxMatrix& operator=(D3DXMATRIX const& rhs)
    {
         // Explicitly copy.
             // Do in here what you were letting the compiler do before.
         return *this;
    }
    // STUFF
};
// New Code
matrix = d3dMatrix;
3 голосов
/ 03 января 2011

Если вы сделаете это, добавьте тест assert или время компиляции:

assert(sizeof(fxMatrix) == sizeof(D3DMatrix));

BOOST_STATIC_ASSERT(sizeof(fxMatrix) == sizeof(D3DMatrix));

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

Но да, это своего рода зло (например, ядерная энергия), поэтому вы должны либо обращаться с этим с надлежащими мерами предосторожности, либо вообще не делать этого.;)

0 голосов
/ 03 января 2011

Наследуйте от обоих и используйте приведения C ++. Компилятор C ++ увидит ваше истинное намерение и выполнит 4-байтовую настройку. Маловероятно, что вы увидите эффект регулировки 4-байтового указателя.

...