我在C ++中苦苦研究STL向量。我一段时间只编译了我的项目x64(实际上是几个月),一切都运行正常,当我记得我也需要这个在x86机器上工作(Win32 DirectX应用程序)。 当然,编译器错误立即出现,如果传递给函数(那些是XMVECTOR和XMMATRIX,以及XMFLOATA结构),16位对齐的结构将不会对齐。我解决了那些成功的问题,并让我的程序再次运行,直到我试图通过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
}
};
这是我的结构,我尝试将几个Armatures加载到一个向量中,例如:
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)设置为all,尝试使用Armature *填充向量并在new运算符中执行aligned_malloc,但程序每次都会在向量中有一个Access违规读取位置0xFFFFFFF退出。 h在push_back函数上,有时在初始化XMVECTOR结构时等。
我在这里错过了一些小事吗?如果有人可以指出明显或任何帮助,我将非常感激。
答案 0 :(得分:2)
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类型,但特别是如果将它们存储在向量中等等,由于默认分配器不符合要求,因此很难获得对齐要求。
答案 1 :(得分:0)
while(!file.eof())
没有按照您的想法行事。 尝试读取文件末尾后,eof()
仅返回true
。在调用push_back(...)之前,您是否检查了file
的错误状态?如果不是,则使用未定义的值初始化最后一个元素。根据您的软件,可能会或可能不会导致运行时错误。