【发布时间】:2014-02-01 20:55:12
【问题描述】:
我知道在参数中使用 const value ;当您不希望函数修改参数时。
所以这个测试代码运行良好:
#include "stdafx.h"
#include <io.h>
#include <iostream>
using namespace std;
void foo (const int y )
{
printf ( "x = %d \n" , y*2 ) ;
}
int _tmain(int argc, _TCHAR* argv[])
{
int y = 3;
foo ( y );
system("pause");
return 0;
}
但是当我在英特尔 SSE 内在函数(例如 *_mm_blend_epi16* 函数)上执行相同操作时,我收到此错误:
error C2057: expected constant expression
这个错误的代码是:
#include "stdafx.h"
#include <io.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int y = 3 ;
__m128i x1,x2;
_mm_blend_epi16(x1,x2,y);
system("pause");
return 0;
}
而_mm_blend_epi16的定义是:
__m128i _mm_blend_epi16( __m128i a, __m128i b, const int mask )
那么,问题是什么?难道我做错了什么 ?
编辑
解决办法是什么?
【问题讨论】:
-
请注意,这确实适用于 gcc(使用 gcc 4.5.2 和 gcc 4.8.2 测试)。 Microsoft Visual Studio 2012 失败。
-
@ScottD 第一个代码在 Visual c++ 2012 中运行良好。问题出在给我上述错误的第二个代码中
-
我明白了。我只是指出这个问题是特定于 Microsoft 编译器的,而不是一般的 C 或 C++ 编译器。也就是说,第二个代码使用 gcc。
-
不可能做你想做的事 -
mask参数是一个立即操作数 - 这意味着它是指令的一部分并且必须在编译时知道。如果您需要一个单独的函数来调用带有掩码作为参数的 _mm_blend_epi16,则必须将其实现为宏并在任何地方编写类似const int mask = 3的代码。或者,您可以使用类似的指令_mm_blendv_epi8对 8 位字进行洗牌,并且不需要掩码是编译时常量(请注意,它必须与_mm_blend_epi16的掩码略有不同。
标签: c++ visual-c++ intrinsics