Domanda

Sono nuovo di Delphi e ho eseguito alcuni test per vedere quali variabili oggetto e variabili stack sono inizializzate per impostazione predefinita:

TInstanceVariables = class
  fBoolean: boolean; // always starts off as false
  fInteger: integer; // always starts off as zero
  fObject: TObject; // always starts off as nil
end;

Questo è il comportamento al quale sono abituato da altre lingue, ma mi chiedo se sia sicuro fare affidamento su di esso in Delphi? Ad esempio, mi chiedo se potrebbe dipendere da un'impostazione del compilatore o forse funzionare in modo diverso su macchine diverse. È normale fare affidamento sui valori inizializzati predefiniti per gli oggetti o impostare esplicitamente tutte le variabili di istanza nel costruttore?

Per quanto riguarda le variabili dello stack (a livello di procedura), i miei test mostrano che i booleani unitizzati sono veri, gli interi unitari sono 2129993264 e gli oggetti non inizializzati sono solo puntatori non validi (cioè non zero). Immagino che la norma sia sempre impostare variabili a livello di procedura prima di accedervi?

È stato utile?

Soluzione

Sì, questo è il comportamento documentato:

  • I campi oggetto sono sempre inizializzati su 0, 0.0, '', False, zero o qualunque altra cosa si applichi.

  • Anche le variabili globali sono sempre inizializzate su 0 etc;

  • Le variabili locali contate dal riferimento * sono sempre inizializzate su zero o '';

  • Le variabili locali non conteggiate * non sono inizializzate, quindi è necessario assegnare un valore prima di poterle utilizzare.

Ricordo che Barry Kelly da qualche parte ha scritto una definizione per "quotazione di riferimento", ma non riesco a trovarla non più, quindi nel frattempo questo dovrebbe avvenire:

  

riferimento contato == che sono contati come riferimento stesso, oppure   contiene direttamente o indirettamente campi (per record) o elementi (per   array) che vengono contati come riferimento: stringa, variante, interfaccia   o array dinamico o array statico contenente tali tipi.

Note:

  • record non è sufficiente per essere conteggiato come riferimento
  • Non l'ho ancora provato con i generici

Altri suggerimenti

Le variabili globali che non hanno un inizializzatore esplicito sono allocate nella sezione BSS dell'eseguibile. In realtà non occupano spazio nello EXE; la sezione BSS è una sezione speciale che il sistema operativo alloca e cancella a zero. Su altri sistemi operativi, esistono meccanismi simili.

Puoi dipendere dal fatto che le variabili globali siano state inizializzate a zero.

I campi di classe sono zero predefinito. Questo è documentato in modo da poter fare affidamento su di esso. Le variabili locali dello stack non sono definite a meno che stringa o interfaccia, siano impostate su zero.

Proprio come una nota a margine (dato che sei nuovo su Delphi): le variabili globali possono essere inizializzate direttamente quando le dichiari:

var myGlobal:integer=99;

Ecco una citazione di Ray Lischners Delphi in breve Chapter 2

  

" Quando Delphi crea per la prima volta un oggetto, tutti i campi iniziano vuoti, ovvero i puntatori vengono inizializzati su zero, le stringhe e le matrici dinamiche sono vuote, i numeri hanno il valore zero, i campi booleani sono falsi e le varianti sono impostato su Non assegnato. (Vedi NewInstance e InitInstance nel Capitolo 5 per i dettagli.) & Quot;

È vero che è necessario inizializzare le variabili locali nell'ambito ... Tratterò il commento sopra che "Le variabili globali sono inizializzate" come dubbio fino a quando non viene fornito un riferimento - non ci credo.

modifica ... Barry Kelly dice che puoi dipendere dal fatto che sono stati inizializzati a zero, e dal momento che fa parte del team di compilatori Delphi credo che sia valido :) Grazie Barry.

Le variabili globali e i dati (campi) dell'istanza dell'oggetto vengono sempre inizializzati su zero. Le variabili locali nelle procedure e nei metodi non sono inizializzate in Win32 Delphi; il loro contenuto è indefinito fino a quando non si assegna loro un valore nel codice.

Anche se una lingua offre inizializzazioni predefinite, non credo che dovresti fare affidamento su di esse. L'inizializzazione su un valore rende molto più chiaro agli altri sviluppatori che potrebbero non conoscere le inizializzazioni predefinite nella lingua e prevenire problemi tra i compilatori.

Dal file della guida di Delphi 2007:

ms-help: //borland.bds5/devcommon/variables_xml.html

  

" Se non inizializzi esplicitamente una variabile globale, il compilatore la inizializza su 0. "

Ho una piccola lamentela con le risposte fornite. Delphi azzera lo spazio di memoria dei globi e degli oggetti appena creati. Mentre questo NORMALMENTE significa che sono inizializzati, c'è un caso in cui non sono: tipi enumerati con valori specifici. E se lo zero non fosse un valore legale ??

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top