是的,它会的。但是,您的代码没有将 achar *
与字符串文字进行比较。它正在比较两个字符串文字。编译器足够聪明,可以发现这一点并优化所有代码。if
仅保留块内的代码。
我们可以通过查看编译器生成的汇编代码看到这一点:
cc -S -std=c11 -pedantic -O3 test.c
首先使用您的原始代码...
#include <stdio.h>
#include <string.h>
int main() {
unsigned int len = 2;
char * str = "OK";
if (len == 2 && strncmp(str, "OK", len) == 0) {
puts("Match");
}
}
然后只用puts
.
#include <stdio.h>
#include <string.h>
int main() {
//unsigned int len = 2;
//char * str = "OK";
//if (len == 2 && strncmp(str, "OK", len) == 0) {
puts("Match");
//}
}
这两个汇编文件实际上是相同的。没有留下任何字符串的痕迹,只有puts
.
.section __TEXT,__text,regular,pure_instructions
.build_version macos, 10, 14 sdk_version 10, 14
.globl _main ## -- Begin function main
.p2align 4, 0x90
_main: ## @main
.cfi_startproc
## %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
leaq L_.str(%rip), %rdi
callq _puts
xorl %eax, %eax
popq %rbp
retq
.cfi_endproc
## -- End function
.section __TEXT,__cstring,cstring_literals
L_.str: ## @.str
.asciz "Match"
.subsections_via_symbols
这是一个专注于优化的糟糕地方。字符串与小字符串的比较不太可能是性能问题。
此外,您建议的优化可能会更慢。您需要获取输入字符串的长度,这需要遍历输入字符串的全长。也许您出于其他原因需要它,但它的边缘情况越来越多。
而strncmp
一旦看到不相等的字符就可以停止。它肯定只需要读取到最小字符串的末尾。