通过引用内联函数传递 __m128i 对象会导致这些对象移动到堆栈吗?

Posted

技术标签:

【中文标题】通过引用内联函数传递 __m128i 对象会导致这些对象移动到堆栈吗?【英文标题】:does passing __m128i objects by reference to inline function cause these objects to be moved to stack? 【发布时间】:2010-04-26 15:41:18 【问题描述】:

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

代码sn-p:

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

【问题讨论】:

【参考方案1】:

谁能说?

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

@~buratinas: 好的,只要你使用一个像样的编译器,即 gcc 或 Intel 的 ICC,你应该没问题。

以上是关于通过引用内联函数传递 __m128i 对象会导致这些对象移动到堆栈吗?的主要内容,如果未能解决你的问题,请参考以下文章

调用 always_inline '__m128i _mm_cvtepu8_epi32(__m128i)' 时内联失败:目标特定选项不匹配 _mm_cvtepu8_epi32 (__m128i __X

_mm_shuffle_ps() 等价于整数向量 (__m128i)?

使用内在函数时未处理的异常

用内在函数初始化 __m128i 常量的最快方法?

将 __m128d 从 MASM 过程返回给 C 调用者

将 __m256i 设置为两个 __m128i 值的值