Ich bin gespannt warum der folgende Code:
#include <string>
int main()
{
std::string a = "ABCDEFGHIJKLMNO";
}
Beim Kompilieren mit -O3
ergibt sich folgender Code:
main: # @main
xor eax, eax
ret
(Ich verstehe vollkommen, dass das nicht verwendete nicht benötigt wird, a
so 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, a
dass 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.