Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法创建一个16字节对齐的类,可以作为参数传递_C++_Windows_Sse - Fatal编程技术网

C++ 有没有办法创建一个16字节对齐的类,可以作为参数传递

C++ 有没有办法创建一个16字节对齐的类,可以作为参数传递,c++,windows,sse,C++,Windows,Sse,我们有一个(数字3浮点)向量类,我希望将其对齐到16字节,以便允许SIMD操作。使用declspec进行16字节对齐会导致大量C2719错误(参数:带有u declspec(align(“#”)的形式参数将不会对齐)。如果我不能传递一个向量,那有什么意义?甚至对向量使用const引用也会导致编译器错误,这让我非常恼火 有没有一种方法可以实现我在这里想要的-在允许结构传递的同时获得16字节的类对齐,而不必对u m128类型做一些愚蠢的把戏?除非您一次操作一堆这样的三维向量结构,否则使用SIMD可能

我们有一个(数字3浮点)向量类,我希望将其对齐到16字节,以便允许SIMD操作。使用declspec进行16字节对齐会导致大量C2719错误(参数:带有u declspec(align(“#”)的形式参数将不会对齐)。如果我不能传递一个向量,那有什么意义?甚至对向量使用const引用也会导致编译器错误,这让我非常恼火


有没有一种方法可以实现我在这里想要的-在允许结构传递的同时获得16字节的类对齐,而不必对u m128类型做一些愚蠢的把戏?

除非您一次操作一堆这样的三维向量结构,否则使用SIMD可能不会带来太多好处,在这种情况下,您可能会以数组的形式传递它们,您可以根据需要对其进行对齐。另一种可能从SIMD中获得一些好处的情况是,如果对每个向量进行大量计算,并且可以对三个通道上的操作进行并行化。在这种情况下,然后在函数的开头进行一些手动操作,将其转换为
\uuu m128
类型可能仍然会给您带来一些好处。

您肯定不需要按值传递数组吗?而是将指针传递给16字节对齐的数组。还是我误解了什么

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

\uu declspec(align(#))
看起来确实没什么用处。C++11支持您想要的东西
alignas
uu declspec(align(#))
被破坏的所有方式下都可以工作。例如,使用
alignas
声明您的类型将导致该类型的参数对齐

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

无论如何,我只是想指出C++具有这个特性,它最终可能会对你有用。除非您可以移动到另一个平台,否则目前您最好不要按值传递参数,正如其他人所提到的,Xbox360上支持一个uu declspec(passinreg),但Visual Studio for Windows目前不支持

您可以在此处投票支持该功能的请求:


对于引擎中的向量参数,我们使用
VectorParameter
类型定义为
const vector
const vector&
,具体取决于平台是否支持通过寄存器传递

虽然这个问题由来已久,但VC++编译器的情况并没有太大变化,所以这些注释可能对某些人有价值。 1) 允许将带有u declspec(align(X))的类或结构传递给函数的简单修复方法是通过引用传递。根据需要使用常量。 2) 在向量代数中使用SIMD肯定是有原因的。通过将quat multiply和quat rotate函数切换到SIMD,我能够将引擎中的动画和蒙皮过程加快20%。没有对齐,就没有阵列。只有两个函数使用float[4]参数。对于一些一开始写得不差并能带来可测量的FPS改进的东西来说,这没什么好打喷嚏的。因为这些都是以后很难优化的事情,所以真的不存在向量代数的过早优化。
3) 如果将向量放入一个类中,堆栈上所有多余的存储和加载指令都会在/O2下优化。因此,虽然通过SIMD进行单个add的好处可以忽略不计,但如果您有背对背运行多个操作的情况,那么生成的代码会非常快。

您想调整整个类吗?为什么不对齐备份存储并在类中管理它呢?这是一个大型引擎的后端编辑。只是看看是否有一种快速而肮脏的方法来启用大量代码,而不必在vector类之外进行大量重写。但是,即使对齐class对象,是什么使它包含的数据对齐?也许我遗漏了什么,但我猜你真的想对向量中的东西进行SIMD,对吧?类中唯一的数据是3个浮点。现在,任何类型的操作符=或任何东西都不能假定对齐。我只是想强制这些值的16字节对齐。我明白了-不同类型的向量。每一点都有帮助。有了像math vector类这样的基础类,将6个存储操作更改为2个,再加上寄存器节省将是一个很好的小提升,特别是如果它几乎是免费的。但从我所看到的情况来看,它并不是免费的,所以在我将来使用更好的编译器之前,我将保留它。听起来像是潜在的过早优化。使用SSE指令的开销不是非零的,所以像这样的微优化在这里和那里保存一些指令可能不会为您节省任何实际时间。这是一个非常公平的答案。再说一次,如果我有一个我可以分析的解决方案,我会尝试一下。但我甚至不能得到:)通过值传递3个浮点值并不是一个大罪。我可以想到任何数量的平台,在这些平台上,这将更加有效,尽管Windows并不是一个寄存器集有限的平台。这是一个大型的继承引擎。如果没有一条非常清晰的成功之路,我不会倾注数百万行代码(尽管这是有保证的)。现在,听起来不值得这么做,这很可悲。我只能希望未来很快到来。上一次我在going Native大会上听说,我们可能会在秋天再获得一点C++11功能,尽管我没有屏息以待。有趣的是,尽管在英特尔芯片上,传递值可能不值得。不过还是要谢谢你的passinreg想法。这也是360上使用的,因此可以从中获得一些好处。感谢您的更新。我甚至都不记得这个问题:)