Да, будет. Однако ваш код не сравнивает char *
со строковым литералом. Это сравнение двух строковых литералов. Компилятор достаточно умен, чтобы заметить это и оптимизировать весь код. Остается только код внутри блока 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
может остановиться, как только увидит неравные символы. И он определенно должен читать только до конца самой маленькой строки.