Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 输入cast char数组[16]到int 128位_C++_C - Fatal编程技术网

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

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'}; 我正在寻找一种比逐字符比较更快地比较两个字符数组的方法。据我所知,我认为

我有两个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数组转换为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+类型转换仅在阵列对齐时运行。