【发布时间】:2015-06-07 13:00:56
【问题描述】:
我有一个结构如下:
static constexpr uint64_t emptyStructValue { 0 };
union MyStruct {
explicit MyStruct(uint64_t comp) : composite(comp){}
struct{
int16_t a;
bool b;
bool c;
float d;
};
uint64_t composite = 0;
bool hasValue(){
return composite != emptyStructValue;
}
};
我在另一个对象中有两个这样的结构:
class B{
Struct s1;
Struct s2;
};
我想知道,给定 B 类型的对象,我如何将所有 128 位加载到 SSE 寄存器中并检查是否设置了单个位?
我找到了_mm_loadu_si128(),但我的数据混合了整数和浮点数?
【问题讨论】:
-
您只想检查是否至少设置了一位?只是为了确定,在花车上做这个时你期望什么?对于整数(和二进制补码),它与检查它是否不为 0 相同,但浮点数更复杂 => 究竟是什么目的?
-
你的结构实例总是包含所有 4 个变量和一些值?它不能是空的。编辑:工会的东西也不会让它变空。
-
"All 64 bits zero" - 你假设
bool有 7 个填充位,所有这些都是零。 -
你的问题是 128 位,你的评论是 64。
-
您应该将您的
bools 设为int8_ts,以便我们保证尺寸和价值。但是,暂且不说:是的,您可以像这样加载两个 64 位联合,无论它们是整数数据和浮点数的混合;既然你有 AVX,你很可能也有 SSE4.1,在这种情况下,pcmpeqq指令(可通过__m128i _mm_cmpeq_epi64(__m128i, __m128i)访问)正是你想要的。