【发布时间】:2013-09-04 19:54:18
【问题描述】:
我正在为 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
}
};
这是我的结构,我尝试将几个 Armature 加载到一个向量中,例如:
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* 填充向量并在 new 运算符中执行 aligned_malloc,但 程序每次退出时都会出现访问冲突读取位置 0xFFFFFFF 有时在向量中。 h 在 push_back 函数上,有时在初始化 XMVECTOR 结构等时。
我在这里错过了一些微不足道的事情吗?那么,如果有人能指出显而易见的问题或提供任何帮助,我将不胜感激。
【问题讨论】:
-
这非常不清楚。具体来说,您将 align(16) 应用于什么?什么是导致运行时错误的具体测试用例?
-
我在提供的代码中没有看到
__declspec_align(16)。您是要对齐整个 Armature 类型,还是对齐其中的特定字段? -
@Oli Charlesworth 对不起,如果我让自己不清楚。我尝试首先将 align(16) 应用于我的结构,在我变得非常绝望之后,我尝试将其设置为其他所有可验证的。而且我不完全理解问题的第二部分,抱歉,我的测试用例是当我调用 armatures.push_back(Armature()) 时,它会在原始“vector.h”或我的 Armature struct 构造函数中随机崩溃当我想初始化一个 XMVECTOR 或 XMMATRIX 时。
-
微软似乎建议您使用 XMFLOAT4 和 XMFLOAT4X4 来存储值,并使用 XMVECTOR 和 XMMATRIX 进行计算。我认为主要是因为这个问题。
-
@JánosTuránszki:这些文件都没有这个错误。 错误在您的代码中。
标签: c++ vector stl directxmath