无法访问std :: vector的16位对齐成员?

时间:2013-09-04 19:54:18

标签: c++ vector stl directxmath

我在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结构时等。

我在这里错过了一些小事吗?如果有人可以指出明显或任何帮助,我将非常感激。

2 个答案:

答案 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的错误状态?如果不是,则使用未定义的值初始化最后一个元素。根据您的软件,可能会或可能不会导致运行时错误。