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

标签 c++ vector stl directxmath

<分区>

我正在为 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,但是程序每次退出时都会出现访问冲突读取位置 0xFFFFFFF 有时在 vector 中。 h 在 push_back 函数上,有时在初始化 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 Loading 和 Vector Storage 函数将数据高效地移动到 XMVECTOR 或 XMMATRIX 局部变量中,执行计算并存储结果。还有流函数(XMVector3TransformStream、XMVector4TransformStream 等)可以直接高效地运行在这些数据类型的数组上。”

您可以存储 XMVECTOR 和 XMMATRIX 类型,但特别是如果您将它们存储在 vector 等中,则很难获得正确的对齐要求,因为默认分配器不符合要求。

关于c++ - 无法访问 std::vector 的 16 位对齐成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18622656/

相关文章:

c++ - 将矩阵传递给函数的问题

python - 将新的 PyObject * 从 C++ 返回到 Python 最终会出现段错误

c++ - 如何使用以下约束动态创建固定长度字符串数组

c++ - 对指针 vector 进行排序会更改 vector 拷贝中的数据?

c++ - 模板函数指针重载

ios - SCNVector3 和 SCNVector3Make 之间的主要区别是什么

c++ - 尝试使用 vector 数组来实现图

c++ - 字节顺序何时成为一个因素?

c++ - unique_copy 元素值从 map 到 vector

c++ - basic_string 预期初始化程序编译错误