C++ 输入cast char数组[16]到int 128位
我有两个16字节字符数组:C++ 输入cast char数组[16]到int 128位,c++,c,C++,C,我有两个16字节字符数组: 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 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数组转换为128 int;像这样
__int128 value = (__int128) word;
__int128 value2 = (__int128) word2;
但是这些都不起作用,因为value和value2包含word和word2的地址
如何将字符数组转换为uu int128?试试看
__int128 value = *(__int128 *)word;
试一试
我只会使用memcmp 你确定你正在使用的编译器会在cpu的某个特殊部分比较int128,在这里128个整数可以被比较? 因为如果它拆分成32位PAR,它将毫无用处
int memcmp(word, word2, 16)
如果您正在寻找极端性能的情况,则必须比较从该逻辑的不同实现中派生的ASM
还要考虑128位数学在mmx或sse或avx的域中。据我所知,这些都是用来对多组数据进行比较的,我不认为在速度增益方面使用它们进行单一比较是有用的
如果它在性能方面是有用的,我打赌gcc、icc和其他c编译器会做这个128位、256位的比较,作为memcmp的内部优化,而不是将想法留给用户。我只会使用memcmp 你确定你正在使用的编译器会在cpu的某个特殊部分比较int128,在这里128个整数可以被比较? 因为如果它拆分成32位PAR,它将毫无用处
int memcmp(word, word2, 16)
如果您正在寻找极端性能的情况,则必须比较从该逻辑的不同实现中派生的ASM
还要考虑128位数学在mmx或sse或avx的域中。据我所知,这些都是用来对多组数据进行比较的,我不认为在速度增益方面使用它们进行单一比较是有用的
如果它在性能方面是有用的,我打赌gcc、icc和其他c编译器会做这个128bit、256bit的比较,作为memcmp的内部优化,而不是将想法留给用户。使用标准比较函数memcmp,让编译器担心优化代码:
memcmp(word, word2, WORD_LENGTH)
如果在分析后发现这对您来说不够快,您可以考虑改进这一点,例如使用联合,或使用SSE2内部函数-但您很可能会发现很难击败memcmp的良好实现。使用标准比较函数memcmp,让编译器为优化代码而烦恼:
memcmp(word, word2, WORD_LENGTH)
如果在评测之后,您发现这对您来说不够快,您可以考虑改进这一点,例如使用联合或使用SSE2内部函数-但您很可能会发现很难击败memcmp的良好实现。注意:您询问的是两种语言,而没有指出您实际使用的是哪种语言。我将尝试回答这两个问题,但我对C的了解已经过时了一些年,所以我可能会在那里弄错一些细节 有几种选择;您必须对它们进行测量,以确定在您的环境中哪个速度最快
一个很好的实现:在C中的相等或C++中的MEMCMP可以对已知大小的小数组进行优化。这也许足够好了
将字节重新解释为另一种类型的唯一明确方法是复制它们:__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
在某些平台上,如果数组没有适当对齐,或者由于其他原因,这可能会失败。注意:您询问的是两种语言,但没有指出您实际使用的是哪种语言。我将尝试回答这两个问题,但我对C的了解已经过时了一些年,所以我可能会在那里弄错一些细节 有几种选择;您必须对它们进行测量,以确定在您的环境中哪个速度最快
一个很好的实现:在C中的相等或C++中的MEMCMP可以对已知大小的小数组进行优化。这也许足够好了
将字节重新解释为另一种类型的唯一明确方法是复制它们:__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
在某些平台上,如果数组不适当对齐,或者由于其他原因,这可能失败。
使用指针或联合,但仍然会有接口问题还是C++?你知道他们是不同的语言,对吧?但是这并不重要,我只想检查这个单词是否是同一个。你试过了MEMCPP吗?@我想类型转换比MMECMP快得多,因为直接使用指针或联合,但是你仍然有接口问题还是C++?你知道它们是不同的语言,对吧?但比特的顺序并不重要,我只想检查这些单词是否相同。有没有y你试过memcmp吗?@SHR我认为类型转换比memcmp更快,因为它是直接的。这是未定义的行为。@AntonSavin:是的,但这可能会有所帮助,因为在检查编译器如何处理这一问题后,速度比可移植性更重要。使用u int128可能已经超出了标准,所以是的,当然,您必须小心,但对于给定的编译器,这可能是一个很好的解决方案。如果您对正在做的事情有适当的注意和了解,那么通过指向_int128的指针间接转换字节数组确实是一种未定义的行为。但这就是问题想要的。这是未定义的行为。@AntonSavin:是的,但这可能会有所帮助,因为在检查编译器如何处理这一问题后,速度比可移植性更重要。使用_int128可能已经超出了标准,所以是的,你当然要小心,但对于给定的编译器,这可能是一个很好的解决方案。如果您对正在做的事情有适当的注意和了解,那么通过指向_int128的指针间接转换字节数组确实是一种未定义的行为。但ISTM正是问题想要的。memcmp是在大多数编译器的assember中实现的。当然,这就是我提出它的原因。int128是常见的吗?还不是很常见,也许128位操作系统将变得常见。memcmp函数比sse+类型转换慢,因为sse使用128位寄存器。然而,sse+类型转换仅在数组对齐时运行。在大多数编译器中,memcmp是在assember中实现的。当然,这就是我提出它的原因。int128是常见的吗?还不是很常见,也许128位操作系统将变得常见。memcmp函数比sse+类型转换慢,因为sse使用128位寄存器。但是,sse+类型转换仅在阵列对齐时运行。