Ich bin gespannt warum der folgende Code:
#include <string>
int main()
{
std::string a = "ABCDEFGHIJKLMNO";
}
Beim Kompilieren mit -O3ergibt sich folgender Code:
main: # @main
xor eax, eax
ret
(Ich verstehe vollkommen, dass das nicht verwendete nicht benötigt wird, aso dass der Compiler es vollständig aus dem generierten Code weglassen kann.)
Allerdings folgendes Programm:
#include <string>
int main()
{
std::string a = "ABCDEFGHIJKLMNOP"; // <-- !!! One Extra P
}
Ausbeuten:
main: # @main
push rbx
sub rsp, 48
lea rbx, [rsp + 32]
mov qword ptr [rsp + 16], rbx
mov qword ptr [rsp + 8], 16
lea rdi, [rsp + 16]
lea rsi, [rsp + 8]
xor edx, edx
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_create(unsigned long&, unsigned long)
mov qword ptr [rsp + 16], rax
mov rcx, qword ptr [rsp + 8]
mov qword ptr [rsp + 32], rcx
movups xmm0, xmmword ptr [rip + .L.str]
movups xmmword ptr [rax], xmm0
mov qword ptr [rsp + 24], rcx
mov rax, qword ptr [rsp + 16]
mov byte ptr [rax + rcx], 0
mov rdi, qword ptr [rsp + 16]
cmp rdi, rbx
je .LBB0_3
call operator delete(void*)
.LBB0_3:
xor eax, eax
add rsp, 48
pop rbx
ret
mov rdi, rax
call _Unwind_Resume
.L.str:
.asciz "ABCDEFGHIJKLMNOP"
wenn mit dem gleichen kompiliert -O3. Ich verstehe nicht, warum es nicht erkennt, adass der String noch nicht verwendet wird, unabhängig davon, dass der String ein Byte länger ist.
Diese Frage ist relevant für gcc 9.1 und clang 8.0 (online: https://gcc.godbolt.org/z/p1Z8Ns ), da andere Compiler in meiner Beobachtung entweder die nicht verwendete Variable (ellcc) entweder vollständig löschen oder Code dafür generieren, unabhängig von der Länge der Zeichenfolge.