有什么办法可以创build一个可以作为parameter passing的16字节alignment的类

我们有一个(数字3浮点数)vector类,我希望alignment到16个字节,以便允许SIMD操作。 使用declspec到16字节alignment会导致一系列C2719错误(参数':具有__declspec(align('#'))的forms参数将不会alignment)。 如果我不能传递一个向量alignment,有什么意义? 即使使用向量的const引用也会导致编译器错误,这真让我很烦恼。

有没有办法做我想在这里 – 获得16字节的类alignment,同时允许结构传递,而不必做一些愚蠢的__m128types的欺骗?

使用SIMD不会有很大的好处,除非你一次在一堆三维矢量结构上运行,在这种情况下,你可能会把它们传递给一个数组,你需要。 另一种情况是,你可能从SIMD获得一些好处,如果你在每个矢量上做了大量的计算,并且你可以在三个通道上并行操作。 在这种情况下,然后在函数的开始处进行一些手动操作,将其转换为__m128类型,可能仍然会为您带来一些好处。

如果我不能传递一个向量对齐,有什么意义?

__declspec(align(#))似乎没有用处。 C ++ 11支持你想要的东西; alignas似乎以__declspec(align(#))被打破的所有方式工作。 例如,使用alignas来声明你的类型将导致该类型的参数对齐。

不幸的是,微软的编译器还不支持标准对齐说明符,而我所知道的唯一编译器就是Clang,它对Windows的支持有限。

无论如何,我只想指出,C ++有这个功能,它最终可能会提供给你。 除非你可以移动到另一个平台,那么现在你可能是最好的,没有像其他人那样提供参数

当然,你不需要通过值来传递数组? 传递一个指向16字节对齐数组的指针。 还是我误解了一些东西?

在Xbox360上有一个__declspec(passinreg)支持,但目前在Visual Studio for Windows中不支持。

您可以投票支持该功能的请求: http : //connect.microsoft.com/VisualStudio/feedback/details/381542/supporting-declspec-passinreg-in-windows

对于我们引擎中的向量参数,我们使用VectorParameter来定义const Vectorconst Vector&取决于平台是否支持通过寄存器传递。

虽然这个问题很老,但VC ++编译器的情况并没有太大的改变,所以也许这些注释对于某个人来说是有价值的。 1)使用__declspec(align(X))传递给函数的类或结构的简单修正是通过引用传递的。 根据需要使用const。 2)使用SIMD作矢量代数是有原因的。 我能够通过切换quat multiply和quat旋转功能到SIMD来加快我们的引擎中的动画和蒙皮通过20%。 没有对齐,没有数组。 只有两个函数,浮动[4] params。 对于一开始写得不好的东西,并导致可测量的FPS改进,这是没有什么可以打喷嚏的。 而且由于这些都是后来难以优化的事情,所以实际上没有像向量代数的过早优化那样的事情。 3)如果你使你的向量成为一个类,堆栈中的所有过多的_mm_store_ps和_mm_load_ps指令都会在/ O2下进行优化。 所以虽然通过SIMD获得一个单一的增加可能是微不足道的,但是如果你有几个背靠背运行的情况,那么最终的代码是快速的。