39 votes

Pourquoi l'instanciation unique_ptr est-elle compilée en un binaire plus grand que le pointeur brut?

J'ai toujours eu l'impression qu'un std::unique_ptr n'avait pas de frais généraux par rapport à l'utilisation d'un pointeur brut. Cependant, compiler le code suivant

 #include <memory>

void raw_pointer() {
  int* p = new int[100];
  delete[] p;
}

void smart_pointer() {
  auto p = std::make_unique<int[]>(100);
}
 

with g++ -std=c++14 -O3 produit l'assemblage suivant:

 raw_pointer():
        sub     rsp, 8
        mov     edi, 400
        call    operator new[](unsigned long)
        add     rsp, 8
        mov     rdi, rax
        jmp     operator delete[](void*)
smart_pointer():
        sub     rsp, 8
        mov     edi, 400
        call    operator new[](unsigned long)
        lea     rdi, [rax+8]
        mov     rcx, rax
        mov     QWORD PTR [rax], 0
        mov     QWORD PTR [rax+392], 0
        mov     rdx, rax
        xor     eax, eax
        and     rdi, -8
        sub     rcx, rdi
        add     ecx, 400
        shr     ecx, 3
        rep stosq
        mov     rdi, rdx
        add     rsp, 8
        jmp     operator delete[](void*)
 

Pourquoi le rendement de smart_pointer() presque trois fois plus grand que raw_pointer() ?

53voto

Holt Points 6689

Parce qu' std::make_unique<int[]>(100) effectue valeur d'initialisation , tout new int[100] effectue une initialisation par défaut - Dans le premier cas, les éléments sont 0-initialisé (pour int), tandis que dans le second cas, les éléments sont de gauche non initialisée. Essayez:

int *p = new int[100]();

Et vous obtiendrez le même résultat qu'avec l' std::unique_ptr.

Voir ce , par exemple, qui stipule que std::make_unique<int[]>(100) est équivalent à:

std::unique_ptr<T>(new int[100]())

Si vous voulez un non-initialisation de tableau avec std::unique_ptr, vous pouvez utiliser1:

std::unique_ptr<int[]>(new int[100]);

1 Comme indiqué par @Ruslan dans les commentaires, être conscient de la différence entre std::make_unique() et std::unique_ptr() - Voir les Différences entre les std::make_unique et std::unique_ptr.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X