C++ DirectX::XMMATRIX错误C2719:u declspec(align(';16&';)赢得';不一致

C++ DirectX::XMMATRIX错误C2719:u declspec(align(';16&';)赢得';不一致,c++,visual-studio-2013,directx,directx-11,directxmath,C++,Visual Studio 2013,Directx,Directx 11,Directxmath,好的,我正在编写我自己的DirectX框架所有关于制作DirectX框架的教程都很旧,并且使用了不推荐的东西,所以我只制作了我自己的一个,尽管我从旧教程中提取了一些东西,并对它们进行了更新,以使用新的Windows 8.1 SDK 问题来了,我在原始代码使用的D3DXMATRIX (33): error C2719: 'unnamed-parameter': formal parameter with __declspec(align('16')) won't be aligned (40):

好的,我正在编写我自己的DirectX框架所有关于制作DirectX框架的教程都很旧,并且使用了不推荐的东西,所以我只制作了我自己的一个,尽管我从旧教程中提取了一些东西,并对它们进行了更新,以使用新的Windows 8.1 SDK 问题来了,我在原始代码使用的
D3DXMATRIX

(33): error C2719: 'unnamed-parameter': formal parameter with __declspec(align('16')) won't be aligned
(40): error C2719: 'unnamed-parameter': formal parameter with __declspec(align('16')) won't be aligned
(42): error C2719: 'worldMatrix': formal parameter with __declspec(align('16')) won't be aligned
(42): error C2719: 'viewMatrix': formal parameter with __declspec(align('16')) won't be aligned
(42): error C2719: 'projectionMatrix': formal parameter with __declspec(align('16')) won't be aligned
这是S_SHADER.h中的第33行:

bool Render(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX);
bool SetSHaderParameters(ID3D11DeviceContext*, XMMATRIX, XMMATRIX, XMMATRIX);
这是S_SHADER.h中的第40行:

bool Render(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX);
bool SetSHaderParameters(ID3D11DeviceContext*, XMMATRIX, XMMATRIX, XMMATRIX);
这是S_SHADER.cpp的第42行:

41 - bool S_SHADER::Render(ID3D11DeviceContext* deviceContext, int indexCount, DirectX::XMMATRIX worldMatrix,  DirectX::XMMATRIX viewMatrix, DirectX::XMMATRIX projectionMatrix)
42 - {
实际上41有所有的代码,42只有开放的括号,不管怎样,我做错了什么

编辑: 我不认为这会有帮助,但是
我有一台带有visual studio 2013的windows 7 64位计算机

这是一个相当复杂的问题,下面将介绍

简而言之,您需要使用调用约定友好的typedef,这些typedef可以与x86\uuuuu fastcall、x64\uuuuuu fastcall、ARM\uuuuu fastcall和新的VS 2013 x86/x64\uuu矢量调用的各种组合一起工作

“理想”解决方案是:

bool XM_CALLCONV Render(ID3D11DeviceContext*, int, FXMMATRIX, CXMMATRIX, CXMMATRIX);

bool XM_CALLCONV SetSHaderParameters(ID3D11DeviceContext*, FXMMATRIX, CXMMATRIX, CXMMATRIX);
您的原始版本实际上是针对x64本机编译的,但每个XMMATRIX都被推送到堆栈上,并且不会“在寄存器中”传递。x64 native保证堆栈变量的16字节对齐。Win32和ARM不支持

对于x86和x64,VS 2013支持一种新的调用约定“_vectorcall”,它可以传递寄存器中的前六(6)_m128值,包括像XMMATRIX这样的异构向量聚合(HVA)。然而,任何不适合寄存器的内容都应该通过“const reference”而不是“value”传递

对于VS 2012及以下版本,x86\uuuFastCall在寄存器中传递前三(3)个\uuuuM128值,但不能在寄存器中传递HVA。由于堆栈变量的自然对齐,剩余部分必须通过“const reference”而不是“value”传递

对于VS 2012及以下版本,x64 \uuuuFastCall从不在寄存器中传递\uuuum128值。虽然堆栈的自然对齐允许XMVECTOR和XMMATRIX作为堆栈上的副本通过“value”传递,但通过“const reference”传递可能更有效

对于ARM,fastcall传递寄存器中的前四(4)个值,并支持HVA。在本例中,这将是一个XMMATRIX

因此DirectXMath的惯例是使用
FXMVECTOR
GXMVECTOR
HXMVECTOR
CXMVECTOR
FXMMATRIX
CXMMATRIX
作为参数,而不是直接使用
XMVECTOR
XMMATRIX
。这一点一开始可能有点复杂,但由于编译器会像您在Win32中看到的那样抱怨,您可以通过一点尝试和(编译器)错误来解决不寻常或复杂的情况

或者,您不必担心向量和矩阵值的“最佳”寄存器传递行为,只需选择一些简单的方法,如:

bool Render(ID3D11DeviceContext*, int, const XMMATRIX&, const XMMATRIX&, const XMMATRIX&);

bool SetSHaderParameters(ID3D11DeviceContext*, const XMMATRIX&, const XMMATRIX&, const XMMATRIX&);

这在所有体系结构和调用约定中都可以正常工作。

您应该在此处添加“directxmath”标记。谢谢。。这对两个函数都有效,但是第42行没有更多的错误:\n您需要更新42以匹配第33行使用的原型。因此,如果使用“简单”解决方案,它应该是
bool S_着色器::Render(ID3D11DeviceContext*deviceContext,int indexCount,DirectX::XMMATRIX&worldMatrix,DirectX::XMMATRIX&viewMatrix,DirectX::XMMATRIX&projectionMatrix
是的,这就是我所做的我在第42行添加了XM_CALLCONV,因此它变成了bool XM_CALLCONV S_着色器::Render(……它给了其他错误(未解决的外部问题)我会在帖子上进行编辑,因为我写了……:)从头到尾阅读。它不长,并且包含很多建议。如果您想要更简单地使用数学库,请查看DirectXMath的包装器,该包装器使其效率更低,但更能解决调用约定等问题。