Я борюсь с векторами 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 и т. д.
Я что-то здесь упускаю? Тогда я был бы очень признателен, если бы кто-то мог указать на очевидное или за любую помощь.
Похоже, 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, но особенно если вы храните их в векторах и т. Д., Может быть очень трудно правильно выстроить требования выравнивания, так как распределители по умолчанию не соответствуют требованиям.
while(!file.eof())
не делает то, что вы думаете, что делает. eof()
только возвращается true
после пытаясь прочитать за конец файла. Вы проверяете состояние ошибки file
перед вызовом push_back (…)? Если нет, последний элемент будет инициализирован с неопределенными значениями. И в зависимости от вашего программного обеспечения, может или не может вызвать ошибки во время выполнения.