View Full Version : [c++] Costruttore salta istruzioni
stdecden
11-08-2007, 14:10
Salve a tutti!!
Io ho la seguente funzione, che é un costruttore di una classe template:
1 template <class T>
2 CListNode<T>::CListNode(T *_Value = 0, unsigned int _ID = 0, std::string _Identifier = "Unknow")
3 {
4 this->Prev = NULL;
5 this->Next = NULL;
6 this->Value = _Value;
7 this->ID = _ID;
8 this->Identifier = _Identifier;
9 }
Il problema é che in fase di esecuzione mi scarta le linie 4,5,6!
In queste linie non posso neanche mettere un punto di interruzione
:help: :muro:
Probabilmente il compilatore è abbastanza intelligente da sostituire quel codice con una lista di inizializzazione e quindi di fatto per il debugger quelle righe non esistono.
Probabilmente il compilatore è abbastanza intelligente da sostituire quel codice con una lista di inizializzazione e quindi di fatto per il debugger quelle righe non esistono. vada per la 4 e la 5, ma come si spiega la 6? il compilatore va addirittura a controllare in tutto il programma che non ci sia nessun pezzo di codice che richiama il costruttore passando un valore diverso dal default? cosa tra l'altro impossibile visto che in tal caso tutte le chiamate al costruttore utilizzerebbero sempre tutti i parametri di default (visto che _Value è il primo parametro), e quindi il compilatore dovrebbe ottimizzare anche tutte le altre linee, cosa che invece non accade.
Il parametro di default non credo che c'entri...
La sostituzione probabilmente avviene in questo modo:
Value(_Value)
Faccio questa supposizione: si ferma a Value perché è un puntatore e la dimensione dei puntatori dipende dalla macchina e di conseguenza è un tipo "primitivo", al contrario unsigned int viene visto come un tipo non primitivo (magari c'è un typedef unsigned int da qualche parte) e questo impone al compilatore un passaggio ulteriore che preferisce fare dentro all'implementazione.
stai debuggando con le ottimizzazioni on?
vada per la 4 e la 5, ma come si spiega la 6? il compilatore va addirittura a controllare in tutto il programma che non ci sia nessun pezzo di codice che richiama il costruttore passando un valore diverso dal default? cosa tra l'altro impossibile visto che in tal caso tutte le chiamate al costruttore utilizzerebbero sempre tutti i parametri di default (visto che _Value è il primo parametro), e quindi il compilatore dovrebbe ottimizzare anche tutte le altre linee, cosa che invece non accade.
Se mettiamo per esplicito le chiamate ai costruttori di default, il codice qui sopra è equivalente al seguente:
CListNode<T>::CListNode(T *_Value = 0, unsigned int _ID = 0, std::string Identifier = "Unknow")
:Value()
{
/*... */
this->Value = _Value;
/*...*/
Per alcuni tipi (in particolare i puntatori) il compilatore è in grado di capire che l'accoppiata costruttore senza argomento + assegnamento si può sostituire con un costruttore di copia:
CListNode<T>::CListNode(T *_Value = 0, unsigned int _ID = 0, std::string Identifier = "Unknow")
:Value(_Value)
{
/* l'assegnamento non c'è più ... */
per cui effettivamente può sparire anche la riga 6
Probabilmente ha compilato con le ottimizzazioni attive
stdecden
12-08-2007, 18:37
É vero mi sono appena accorto dopo che stavo facendo il debug con le impostazioni release(Dove credo siano attive le ottimizzazioni) :doh:
grazie comunque delle vostre risposte
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.