After trying, I'm wondering why GCC is able to do DCE on unused malloc
or new
buffer but not on unused vector
?
malloc
case: https://godbolt.org/z/xKx5Y1
void fun() {
int *x = (int *)malloc(sizeof(int) * 100);
}
Resulting assembly:
fun():
ret
new
case: https://godbolt.org/z/66drKr
void fun() {
int *x = new int[100];
}
Resulting assembly:
fun():
ret
vector
case: https://godbolt.org/z/TWhE1E
void fun() {
vector<int> x(100);
}
Resulting assembly:
fun():
sub rsp, 8
mov edi, 400
call operator new(unsigned long)
mov esi, 400
lea rdi, [rax+8]
mov rcx, rax
mov QWORD PTR [rax], 0
mov r8, rax
mov QWORD PTR [rax+392], 0
and rdi, -8
xor eax, eax
sub rcx, rdi
add ecx, 400
shr ecx, 3
rep stosq
mov rdi, r8
add rsp, 8
jmp operator delete(void*, unsigned long)