Per questo codice:L'inserimento in std :: unordered_map richiama la funzione hash due volte in STL di MSVC++, progettazione errata o motivo speciale?
#include<unordered_map>
#include<iostream>
using namespace std;
struct myhash {
unsigned operator()(const unsigned&v)const {
cout<<"Hash function is called:"<<v<<endl;
return v;
}
};
unordered_map<unsigned,unsigned,myhash>mp;
int main() {
for (unsigned i=0;i<3;++i) {
cout<<"Visiting hash table:"<<i<<endl;
++mp[i];
}
}
Quando si utilizza g ++, non c'è nessuna sorpresa con l'uscita:
Visiting hash table:0
Hash function is called:0
Visiting hash table:1
Hash function is called:1
Visiting hash table:2
Hash function is called:2
Ma l'uscita di MSVC++ (2015) mi ha scioccato:
Visiting hash table:0
Hash function is called:0
Hash function is called:0
Visiting hash table:1
Hash function is called:1
Hash function is called:1
Visiting hash table:2
Hash function is called:2
Hash function is called:2
Ulteriori i test hanno dimostrato che l'STL di MSVC++ chiama la funzione hash due volte quando si inserisce un nuovo elemento in unordered_map e una volta se l'elemento è già presente nella mappa.
Mi sento piuttosto strano per questo comportamento perché penso che il caching del risultato sia molto più veloce di chiamare nuovamente la funzione di hash nella maggior parte dei casi (se l'implementazione ha davvero bisogno di usare il valore hash due volte). O meglio, penso che sia sufficiente usare la funzione hash una volta per trovare il bucket per l'elemento e la seguente routine non è rilevante per il valore hash.
Tuttavia, poiché gli autori di STL sono molto più esperti di me in C++, non so se hanno alcune ragioni speciali per questa implementazione? È solo un cattivo design o causato da alcuni motivi a me sconosciuti?
Era una build di debug o una build di rilascio? È possibile che uno degli accessi sia a scopo di debug –
Mi sembra di ricordare STL (manutentore di librerie standard di MS) che afferma che i loro meccanismi sottostanti sono resi più complicati perché doveva supportare sia 'unordered_meow' che il loro 'hash_meow' non standard. Mi chiedo se questo è uno dei sintomi risultanti. –
Si prega di aprire un bug su https://connect.microsoft.com/visualstudio. –