输入cast char数组[16]到int 128位

时间:2014-12-19 13:12:51

标签: c++ c

我有两个16bytes的char数组:

char word[WORD_LENGTH] = { '1', '2', '3', '4', '5', '6','7','8','9','0','1','2','3','4','5','\0'};
char word2[WORD_LENGTH] = { '1', '2', '3', '4', '5', '6','7','8','9','0','1','2','3','4','5','\0'};

我正在寻找一种方法来比较两个char数组的速度,而不是比较逐个字符。据我所知,我认为我可以使用类型转换将char数组转换为128 int;像这样

__int128 value = (__int128) word;
__int128 value2 = (__int128) word2;

但这些不起作用,因为value和value2包含word和word2的地址。

我如何将char数组转换为__int128?

5 个答案:

答案 0 :(得分:2)

我只想使用memcmp。

你确定你正在使用的编译器会比较cpu的某些特殊部分中的int128,其中128个整数可以比较吗? 因为如果它在32位解析中分裂它将是无用的。

int memcmp(word, word2, 16)

如果您正在寻找极端性能案例,则必须比较源自此逻辑的不同实现的ASM

还要考虑128位数学是在mmx或sse或avx的域中。据我所知,那些意图用于多组数据,我不认为在速度增益方面使用它们进行单次比较是有用的。

如果它在性能方面有用,我打赌gcc,icc和其他c编译器会做这个128位,256位比较作为memcmp的内部优化而不是将想法留给用户。

答案 1 :(得分:1)

尝试

__int128 value = *(__int128 *)word;

答案 2 :(得分:1)

注意:您询问的是两种语言,而不是指出您实际使用的是哪种语言。我会尝试回答两者,但我对C的了解已经过时了,所以我可能会在那里得到一些错误的细节。

有几种选择;你必须测量它们以确定哪种环境最快。

std::equal(在C ++中)或memcmp(在C中)的良好实现可能针对已知大小的小数组进行优化。这可能已经足够了。

将字节重新解释为另一种类型的唯一明确定义的方法是复制它们:

__int128 value;
copy(begin(word), end(word), reinterpret_cast<char*>(&value));  // C++
memcpy((char*)(&value), word, WORD_SIZE)                        // C

编译器可能会也可能不会优化它来加载单词而不是字节。

如果所有其他方法都失败了,您可以诉诸正式的未定义行为:

__int128 value = *reinterpret_cast<__int128*>(word); // *(__int128*)word in C

在某些平台上,如果阵列没有适当对齐,或者出于其他原因,这可能会失败。

答案 3 :(得分:0)

使用标准比较函数memcmp,让编译器担心优化代码:

memcmp(word, word2, WORD_LENGTH)

如果在分析后发现这对你来说不够快,你可以担心改善它(例如通过使用联合,或使用SSE2内在函数) - 但你很可能会发现很难击败一个好的实现memcmp。

答案 4 :(得分:0)

您应该使用指向__int128的指针。

我用__int64类型尝试了它(我的MSVC不支持__int128)并且它工作正常:

__int64 *value = (__int64*) word;
__int64 *value2 = (__int64*) word2;

请注意,单词[0]的值将是低有效字节,因此比较将开始&#39;用词[15]。