Closed. This question needs details or clarity。它当前不接受答案。
想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。
7年前关闭。
Improve this question
我在C++中苦苦挣扎STL vector 。一次(实际上几个月),我只为x64编译项目,并且一切运行良好,当我想起我也需要在x86机器(Win32 DirectX应用程序)上工作时。
当然,编译器错误会立即出现,例如,如果将16位对齐的结构传递给函数,则它们将不对齐(它们是XMVECTOR和XMMATRIX,以及XMFLOATA结构)。我成功地解决了这些问题,然后再次运行我的程序,直到尝试通过push_back()和emplace_back()将这些结构加载到std::vectors中。我给出一个简短的示例代码以使其清晰:
那就是我的结构,我尝试将多个电枢加载到 vector 中,例如:
完整代码在这里:http://pastebin.com/6D1wF4Vh
我尝试将__declspec_align(16)设置为所有内容,尝试使用Armature *填充 vector 并在new运算符中进行aligned_malloc,但每次退出时,程序都会退出,并且在push_back函数上的vector.h中有时会出现访问冲突读取位置0xFFFFFFF ,有时是在初始化XMVECTOR结构时等。
我在这里错过了一些琐碎的事情吗?然后,如果有人可以指出明显的问题或寻求任何帮助,我将不胜感激。
想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。
7年前关闭。
Improve this question
我在C++中苦苦挣扎STL vector 。一次(实际上几个月),我只为x64编译项目,并且一切运行良好,当我想起我也需要在x86机器(Win32 DirectX应用程序)上工作时。
当然,编译器错误会立即出现,例如,如果将16位对齐的结构传递给函数,则它们将不对齐(它们是XMVECTOR和XMMATRIX,以及XMFLOATA结构)。我成功地解决了这些问题,然后再次运行我的程序,直到尝试通过push_back()和emplace_back()将这些结构加载到std::vectors中。我给出一个简短的示例代码以使其清晰:
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
}
};
那就是我的结构,我尝试将多个电枢加载到 vector 中,例如:
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 *填充 vector 并在new运算符中进行aligned_malloc,但每次退出时,程序都会退出,并且在push_back函数上的vector.h中有时会出现访问冲突读取位置0xFFFFFFF ,有时是在初始化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等用作结构的成员。此外,您可以使用“ vector 加载”和“ vector 存储”功能将数据有效地移动到XMVECTOR或XMMATRIX局部变量中,执行计算并存储结果。还有流功能(XMVector3TransformStream,XMVector4TransformStream等)可以直接对数组这些数据类型。”
您可以存储XMVECTOR和XMMATRIX类型,但是特别是如果将它们存储在 vector 中,等等,由于默认分配器不符合要求,因此很难正确地满足对齐要求。
10-04 13:59