我有一个具有以下组成的结构:
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 :(得分:3)
实际上,如果(sizeof(B) == 2*sizeof(uint64_t)
,我认为没有理由不做你的建议。但是,如果速度很重要(看起来很像),则应将B
对象与128位边界对齐,这样就可以使用_mm_load_si128
代替_mm_loadu_si128
。< / p>
编辑添加:实际上,在64位模式下,使用常规操作码可能更快。类似的东西:
mov rax,[rsi]
or rax,[rsi+8]
jnz BitSet
即使在32位模式下,它也可能会变得更快。你将不得不进行实验。