Не можете получить доступ к 16-разрядным выровненным членам std :: vector?

Я борюсь с векторами STL в C ++. Я компилировал свой проект только для x64 какое-то время (фактически в течение нескольких месяцев), и все работало нормально, когда я вспомнил, что мне нужно это также для работы на машинах x86 (приложение Win32 DirectX).
Конечно, ошибки компилятора возникли мгновенно, что 16-битные выровненные структуры не будут выровнены, если, например, передать функцию (это структуры XMVECTOR и XMMATRIX, и XMFLOATA). Я успешно разрешил их и снова запустил программу, пока не попытался загрузить эти структуры в std :: vectors с помощью push_back () и emplace_back (). Я приведу короткий пример кода, который будет понятен:

struct Armature
{
string name;
int index;
//{...} There are much more
XMVECTOR translation; //Four 32 bit floating point components aligned on a 16 byte
// boundary and mapped to hardware vector registers
XMVECTOR rotation;
XMVECTOR scale;
XMMATRIX world; //it is like 4 XMVECTORs (4*4 matrix)

Armature(){
//I initialize everything here
}
};

Это моя структура, и я пытаюсь загрузить несколько арматур в вектор, например:

std::vector<Armature> armatures;

while(ThereAreMoreArmaturesToRead()){ //roughly like this, I just parse a file and load up the information from there to fill out my Armature structure
armatures.push_back( Armature() );
}

Полный код здесь: http://pastebin.com/6D1wF4Vh

Я попытался установить __declspec_align (16) для всего, попытался заполнить вектор с помощью Armature * и сделать align_malloc в новом операторе, но программа завершается каждый раз с местом чтения нарушения доступа 0xFFFFFFF, иногда в vector.h функции push_back, иногда при инициализации структуры XMVECTOR и т. д.

Я что-то здесь упускаю? Тогда я был бы очень признателен, если бы кто-то мог указать на очевидное или за любую помощь.

1

Решение

Похоже, Microsoft рекомендует использовать XMFLOAT4 и XMFLOAT4X4 для хранения значений, а также использовать XMVECTOR и XMMATRIX для расчетов.

Из справки DirectXMath: (http://msdn.microsoft.com/en-us/library/windows/desktop/ee418725(v=vs.85).aspx#basic_usage)

«Однако зачастую проще и компактнее избегать использования XMVECTOR или XMMATRIX непосредственно в классе или структуре. Вместо этого используйте XMFLOAT3, XMFLOAT4, XMFLOAT4X3, XMFLOAT4X4 и т. Д. В качестве элементов вашей структуры. Далее, вы можно использовать функции векторной загрузки и векторного хранения для эффективного перемещения данных в локальные переменные XMVECTOR или XMMATRIX, выполнения вычислений и сохранения результатов, а также потоковых функций (XMVector3TransformStream, XMVector4TransformStream и т. д.), которые эффективно работают непосредственно с массивами эти типы данных. «

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

2

Другие решения

while(!file.eof()) не делает то, что вы думаете, что делает. eof() только возвращается true после пытаясь прочитать за конец файла. Вы проверяете состояние ошибки file перед вызовом push_back (…)? Если нет, последний элемент будет инициализирован с неопределенными значениями. И в зависимости от вашего программного обеспечения, может или не может вызвать ошибки во время выполнения.

0

По вопросам рекламы [email protected]