【发布时间】:2018-08-22 03:24:54
【问题描述】:
(编者注:这个问题最初是:应该如何访问 __m128i 对象的 m128i_i8 成员或一般成员?,试图在 GCC 的定义中使用 MSVC 特定的方法__m128i。但这是一个 XY 问题,接受的答案是关于这里的 XY 问题。另一个答案确实回答了这个问题。)
我知道微软建议不要直接访问这些对象的成员,但我需要设置它们,而 documentation 非常缺乏。
我继续收到错误“request for member 'm128i_i8' in '(my var name)', which is non-class type 'wirelabel {aka __vector(2) long long int}'”我没有理解,因为我已经包含了所有正确的标题,并且它确实识别 __m128i 变量。
注意 1:wirelabel 是 __m128i 的 typedef,即存在于标头中
typedef __m128i wirelabel
Note2:使用 Note1 的原因在以下其他问题中进行了解释: tbb::cache_aligned_allocator: Getting "request for member...which is of non-class type" with __m128i. User error or bug?
注意3:我使用的是编译器g++
注意4:以下问题没有回答我的问题,但确实讨论了相关信息Why should you not access the __m128i fields directly?
我也知道有一个 _mm_set_epi8 函数,但它要求您一次设置所有 8 位部分,目前这不是我的选择。
接受的答案回答的问题:
编辑:有人问我为什么我认为我需要访问 __m128i 对象的 16 个 8 位部分中的每一个,原因如下:我有一个大小为 ' 的 bool 数组n*128'(n 是 size_t),我需要将它们存储在大小为 'n' 的 'wirelabel' 数组中。
现在因为 wirelabel 只是 __m128i 的别名/typedef(如果有差异,请纠正我),128 个布尔值的每个 'n' 索引都可以存储在 'wirelabel' 数组中。
但是,为了做到这一点,我认为需要将每 8 位转换为有符号等效项,并将其存储在数组中每个“wirelabel”指针的正确 8 位索引中。
【问题讨论】:
-
你使用的是哪个编译器?
-
我假设您没有使用 Visual C++,因为它没有
__vector关键字 AFAICT -
“Note1”跟什么有什么关系?
-
Note1 的原因在 Note2 中有解释 no?你想澄清一下吗?如果是这样,请告诉我。
标签: c++ gcc sse intrinsics type-punning