Por que essa loja morta de unique_ptr não pode ser eliminada?
#include <memory>
#include <vector>
using namespace std;
vector<unique_ptr<int>> e;
void f(unique_ptr<int> u) {
e.emplace_back(move(u));
}
Para ambos Clang e GCC, o snippet de código acima gera algo como:
f(std::unique_ptr<int, std::default_delete<int> >):
mov rsi, QWORD PTR e[rip+8] # rsi: vector.end_ptr
cmp rsi, QWORD PTR e[rip+16] # [e + rip + 16]: vector.storage_end_ptr
je .L52 # Slow path, need to reallocate
mov rax, QWORD PTR [rdi] # rax: unique_ptr<int> u
add rsi, 8 # end_ptr += 8
mov QWORD PTR [rdi], 0 # <==== Do we need to set the argument u to null here?
mov QWORD PTR [rsi-8], rax # *(end_ptr - 8) = u
mov QWORD PTR e[rip+8], rsi # update end_ptr
ret
.L52: # omitted
Eu queria saber por que o compilador geramov QWORD PTR[rdi], 0
nesta função? Existe alguma convenção que exija o compilador para fazer isso?
Moreover, para casos mais simples comoist:
void f(unique_ptr<int> u);
void h(int x) {
auto p = make_unique<int>(x);
f(move(p));
}
Por que o compilador gera:
call operator delete(void*, unsigned long)
no fim deh()
, dado que p é semprenullptr
após a invocação def
?