1

我正在使用 SSE2 内在函数为 8x16 位向量编写转置函数。由于该函数有 8 个参数(一个 8x8x16 位大小的矩阵),我只能通过引用传递它们。编译器会对此进行优化吗(我的意思是,这些 __m128i 对象会在寄存器而不是堆栈中传递)吗?

代码片段:

inline void transpose (__m128i &a0, __m128i &a1, __m128i &a2, __m128i &a3,
                       __m128i &a4, __m128i &a5, __m128i &a6, __m128i &a7) {
    ....
    }
4

3 回答 3

3

谁能说?

为什么不编译它并查看反汇编?这是唯一确定的方法。

于 2010-04-26T15:45:00.860 回答
2

很有可能它们不会被推入堆栈。如果函数是内联的,编译器实际上会将操作(代码)从被调用函数推送到被调用函数,而不是将数据从调用者传递给被调用者。

现在, inline 是一个提示,因此编译器可以决定不实际内联调用,然后您必须遵循 Zan 的建议并实际检查编译代码的样子。

于 2010-04-26T16:19:56.980 回答
0

请注意,此限制仅适用于 Windows 和 MSVC(++)(您可能应该相应地标记您的问题)。

我没有用 C++ 和引用尝试过这个,但是使用 MSVC 和像这样的内联指针,编译器似乎确实优化了间接。大概同样适用于 C++ 引用,但正如另一位海报指出的那样,您应该查看生成的代码以进行检查。

于 2010-04-26T16:12:54.240 回答