2016-11-02 1 views
0

J'ai récemment remarqué que std::vector efface sa mémoire avec des zéros après l'allocation.Pourquoi std :: vector zero initilize sa mémoire?

J'ai créé des conteneurs similaires avant (bien que non conforme à std) et je n'ai jamais eu besoin de zéro explicitement la mémoire avant de créer de nouveaux éléments.

Je ne vois pas de raison de le faire et je me demandais pourquoi.

À titre d'illustration:

struct S { 
    int s[128]; 
}; 

bool vector_zeroed() { 
    std::vector<S> c; 
    while(c.size() < 1000) { 
     c.emplace_back(); 
    } 

    bool zeroed = true; 
    for(const auto& s : c) { 
     for(int i : s.s) { 
      zeroed &= i == 0; 
     } 
    } 
    return zeroed; 
} 

bool array_zeroed() { 
    bool zeroed = true; 
    auto *s = new S[1000]; 
    for(int k = 0; k != 1000; ++k) { 
     for(int i : s[k].s) { 
      zeroed &= i == 0; 
     } 
    } 
    delete[] s; 
    return zeroed; 
} 

vector_zeroed() semble toujours revenir true tout en array_zeroed() retours false.

Je suis évidemment manquer quelque chose ici mais je ne sais pas quoi.

+1

Cela se produit en mode de sortie? – tkausl

+1

Comment avez-vous créé le vecteur? si vous avez utilisé 'reserve', la mémoire ne devrait pas être remise à zéro. – NathanOliver

+5

S'il vous plaît être plus explicite. Qu'est-ce * exactement * avez-vous remarqué? Quel code * exactement * vous a fait remarquer? Je peux créer des situations où 'std :: vector's n'a pas de mémoire nulle. Je peux créer des situations où un 'std :: vector's fait zéro mémoire. – Yakk

Répondre

2

documentation de référence du RPC:

les Met à zéro éléments de types non de classe surchargées constructeurs ci-dessous comme int, qui est différent du comportement de nouveaux [], ce qui les laisse non initialisée.

explicit vector(size_type count); (since C++11) (until C++14) 
explicit vector(size_type count, const Allocator& alloc = Allocator()); 
(since C++14) 

http://en.cppreference.com/w/cpp/container/vector/vector

+0

C'est peut-être ce que je cherche. new [] laisse les éléments non initialisés alors que new [](); ne fait pas. TIL –

3

Lors de la création d'un std::vector avec n éléments (au lieu de simplement utiliser reserve pour réserver de l'espace pour eux sans créer réellement), le constructeur par défaut est appelé sur chacun des éléments. Dans le cas de primitives numériques (telles que int s ou double s), l'action du constructeur par défaut consiste à définir la valeur sur zéro.