Yes it will. However, your code is not comparing a char * to a string literal. It is comparing two string literals. The compiler is smart enough to spot this and optimize all the code away. Only the code inside the if block remains.
We can see this by looking at the assembly code generated by the comiler:
cc -S -std=c11 -pedantic -O3 test.c
First with your original code...
#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"); } }
Then with just the 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"); //} }
The two assembly files are practically the same. No trace of the strings remains, only the 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
This is a poor place to focus on optimization. String comparison against small strings is very unlikely to be a performance problem.
Furthermore, your proposed optimization is likely slower. You need to get the length of the input string, and that requires walking the full length of the input string. Maybe you need that for other reasons, but its an increasing edge case.
Whereas strncmp can stop as soon as it sees unequal characters. And it definitely only has to read up to the end of the smallest string.
strcmp(instead ofstrncmp) which would implicitly do that without the need forlen == 2test.strcmp(str, "OK");and let the compiler doing possible optimization'\0'at the end?strncmpyou do not test this.