Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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 比较两个相同长度字符串的最快方法_C_String_Performance_Compare - Fatal编程技术网

C 比较两个相同长度字符串的最快方法

C 比较两个相同长度字符串的最快方法,c,string,performance,compare,C,String,Performance,Compare,字符串固定长度为8,包含字母数字字符,并用空格右填充 即 等等 我在想memcmp可能是这里最快的 如果字符串具有固定的等长,则memcmp是一种好方法。如果字符串具有固定的等长,则memcmp是一种好方法。如果通过编译器特定属性确保字符串在8字节边界上对齐,则可以执行以下操作: uint64_t a = *((uint64_t *) "STRING1 "); uint64_t b = *((uint64_t *) "STR2 "); 然后,a==b应转换为单个64位指令 或者,如果它们

字符串固定长度为8,包含字母数字字符,并用空格右填充

等等


我在想
memcmp
可能是这里最快的

如果字符串具有固定的等长,则
memcmp
是一种好方法。

如果字符串具有固定的等长,则
memcmp
是一种好方法。

如果通过编译器特定属性确保字符串在8字节边界上对齐,则可以执行以下操作:

uint64_t a = *((uint64_t *) "STRING1 ");
uint64_t b = *((uint64_t *) "STR2    ");
然后,
a==b
应转换为单个64位指令

或者,如果它们只是常量不可变字符串(存储在进程的只读区域),则可以继续比较
const char*
指针本身。这仍然是一个可靠的测试,因为在当前翻译单元中出现两次的字符串文本应该引用相同的内存:

/* fails because the two strings are stored at different locations */
"STRING1 " == "STR2    "
/* should succeed, even the silliest compiler should merge both literals */
"STRING1 " == "STRING1 "

如果通过编译器特定属性确保字符串在8字节边界上对齐,则可以执行以下操作:

uint64_t a = *((uint64_t *) "STRING1 ");
uint64_t b = *((uint64_t *) "STR2    ");
然后,
a==b
应转换为单个64位指令

或者,如果它们只是常量不可变字符串(存储在进程的只读区域),则可以继续比较
const char*
指针本身。这仍然是一个可靠的测试,因为在当前翻译单元中出现两次的字符串文本应该引用相同的内存:

/* fails because the two strings are stored at different locations */
"STRING1 " == "STR2    "
/* should succeed, even the silliest compiler should merge both literals */
"STRING1 " == "STRING1 "

配置文件配置文件。。。如果字符串比较不是应用程序中的瓶颈(即,如果不是在一个紧密的循环中比较数千个字符串),则不要漫无目的地过度优化。
std::pair p=std::mismatch(str1,str1+8,str2);如果(p.first==str1+8){…}
。对于char,C++库应该调用MEMCMP。Kerrek的建议有科学的理由:简言之:如果你需要优化,首先找到最常见的情况,然后再优化它。。。如果字符串比较不是应用程序中的瓶颈(即,如果不是在一个紧密的循环中比较数千个字符串),则不要漫无目的地过度优化。
std::pair p=std::mismatch(str1,str1+8,str2);如果(p.first==str1+8){…}
。对于char,C++库应该调用MEMCMP。Kerrek的建议有科学的理由:简言之:如果需要优化,请先找到最常见的情况,然后进行优化。如果通过网络保存这些值,然后将其加载到其他平台上,则可能会出现endian问题。还有一种可能性是,访问时字符串可能没有正确对齐-许多平台不喜欢访问uint64,除非对齐到8字节边界,但对字符数组没有这样的约束+至少是一个好主意的基础——解决任何问题都应该很容易。我不认为这是一个非常好的主意。在一个体面的平台<代码> MeCMP < /代码>中,以一个常数大小作为参数,应该在不混淆代码的情况下达到类似的目的。“JunggStud:如果你认为是混淆,那么不要看<代码> NGXXSRXXCMMP < /代码>宏:- -下边是技术上未定义的行为……除非您找到一个编译器扩展来保证这一点。@Steve314:通过联合进行类型双关在ISO-C99中是合法的,该脚注说明了TC3是显式添加的;如果您不喜欢将“非法”作为“调用未定义行为”的同义词,请使用“不可移植”、“如果您错误地斜视编译器标志会导致代码中断”或“在确认实现时会让恶魔飞出您鼻子的代码”,如果您通过网络保存这些值,然后将它们加载到另一个平台上,则可能是endian问题。还有一种可能性是,访问时字符串可能没有正确对齐-许多平台不喜欢访问uint64,除非对齐到8字节边界,但对字符数组没有这样的约束+至少是一个好主意的基础——解决任何问题都应该很容易。我不认为这是一个非常好的主意。在一个体面的平台<代码> MeCMP < /代码>中,以一个常数大小作为参数,应该在不混淆代码的情况下达到类似的目的。“JunggStud:如果你认为是混淆,那么不要看<代码> NGXXSRXXCMMP < /代码>宏:- -下边是技术上未定义的行为……除非您找到一个编译器扩展来保证这一点。@Steve314:通过联合进行类型双关在ISO-C99中是合法的,该脚注说明了TC3是显式添加的;如果您不喜欢将“非法”作为“调用未定义行为”的同义词,请使用“不可移植”、“如果您错误地斜视编译器标志会导致代码中断”或“在确认实现时会让恶魔飞出您鼻子的代码”