我在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
}
};
这是我的结构,我尝试将几个骨架加载到一个向量中,例如:
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* 填充向量并在新运算符中执行aligned_malloc,但程序每次都以 Access 违规读取位置退出 0xFFFFFFF有时在 push_back 函数的 vector.h 中,有时在初始化 XMVECTOR 结构等。
我在这里错过了一些琐碎的东西吗?那么,如果有人能指出显而易见的事情,或者提供任何帮助,我将不胜感激。
建议您使用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
。在调用 push_back(...) 之前检查file
的错误状态吗?否则,最后一个元素将使用未定义的值进行初始化。根据您的软件,可能会导致也可能不会导致运行时错误。