Это ваш C код:
int x1()
{
char *a = "abcd";
char *b = "efgh";
printf("%d", strcmp(a,b));
}
int x2()
{
printf("%d", strcmp("abcd", "efgh"));
}
И это сгенерированный вывод сборки для обеих функций:
.LC0:
.string "abcd"
.LC1:
.string "efgh"
.LC2:
.string "%d"
x1:
push rbp
mov rbp, rsp
sub rsp, 16
mov QWORD PTR [rbp-8], OFFSET FLAT:.LC0
mov QWORD PTR [rbp-16], OFFSET FLAT:.LC1
mov rdx, QWORD PTR [rbp-16]
mov rax, QWORD PTR [rbp-8]
mov rsi, rdx
mov rdi, rax
call strcmp // the strcmp function is actually called
mov esi, eax
mov edi, OFFSET FLAT:.LC2
mov eax, 0
call printf
nop
leave
ret
x2:
push rbp
mov rbp, rsp
mov esi, -1 // strcmp is never called, the compiler
// knows what the result will be and it just
// uses -1
mov edi, OFFSET FLAT:.LC2
mov eax, 0
call printf
nop
pop rbp
ret
Когда компилятор видит strcmp("abcd", "efgh")
, он знает результат заранее, потому что он знает, что "abcd"
предшествует "efgh"
.
Но если он видит strcmp(a,b)
, он не знает и, следовательно, генерирует код, который на самом деле вызывает strcmp
.
С другим компилятором или с другими настройками компилятора все может быть иначе. Вы действительно не должны заботиться о таких деталях, по крайней мере, на начальном уровне.