Domanda

Ho una grande applicazione Delphi e sto cercando di mantenere il basso ingombro di memoria.

Nel mio programma sto usando un componente (Taco) e un componente (TBurrito) che eredita da taco. Ora solo per quanto riguarda l'utilizzo della memoria delle classi e non i casi effettivi, quale scenario utilizza più memoria?

A. Usando solo la componente TBurrito ovunque

o

B. Usando una combinazione di componenti Taco e TBurrito?

Il mio unico pensiero è che, poiché TBurrito eredita Taco, la classe Taco è già memorizzato nella memoria e quindi di utilizzarlo non aumenterà l'impronta della memoria più di tanto.

* Nota -. I nomi dei componenti non sono realmente Taco e Burrito

È stato utile?

Soluzione

Ogni istanza di Burrito occuperà almeno quanto la memoria come un esempio di Taco. Taco.InstanceSize Sottrarre da Burrito.InstanceSize per scoprire quanto più.

Utilizzando Burrito esclusivamente non ti salverà la memoria; la definizione di Taco esisterà ancora, anche se non si hanno le istanze di quella classe esatto, perché, per lo meno, Burrito.ParentClass ha ancora bisogno di fare riferimento ad esso.

Utilizzare il più piccolo componente che raggiunge le vostre esigenze, ma a meno che Burrito è enorme rispetto a Taco o hai un gran numero di istanze Burrito che potrebbero essere casi Taco invece, si sta probabilmente non andando a vedere molto effetto complessivo sul vostro utilizzo della memoria. Che verrà dal astenendosi dal carico intere forme, o di carico solo pezzi di un file invece di tutta la faccenda.

Altri suggerimenti

Corsi solo utilizzano la memoria per i loro VMTS. Fino a che realmente esempio una classe, non occupa spazio, ma per il VMT, e c'è solo un VMT per ogni classe. La dimensione VMT dipende solo dal numero di metodi di una classe virtuale ha in realtà, perché non v'è una voce per ogni metodo virtuale. I metodi statici sono risolti in fase di compilazione e non utilizzano lo spazio di memoria. Altri dati VMT hanno una dimensione fissa (anche se può essere diverso in diversa versione di Delphi). metodi dinamici sono stati introdotti per mantenere VMTS minore. Questo perché eredita una classe creerà una nuova VMT con tutti gli "slot" di metodi virtuali della classe padre, oltre a quelli della classe ereditata. metodi dinamici utilizzano run-time invio del codice di cercare il metodo da richiamare. Perché sono po 'più lento, il loro uso è stato suggerito solo per le classi che hanno sovrascritto solo pochi metodi di grandi classi padre. Se la memoria non è un problema, non ci sono ragioni per usarli. Che potrebbe anche utilizzare lo spazio di memoria sono informazioni RTTI, anche se non ho mai indagare dove il modo in cui sono memorizzati. In ogni caso, se si utilizza una classe figlia, suo genitore VMT dovrebbe essere necessario pure, perché la classe bambino può chiamare quelli ereditati. Ma se non si utilizza classe molto ampia con un sacco di metodi virtuali e pochi casi, credo che la maggior parte della memoria utilizzata dalla vostra applicazione sarà quello di istanze di classe, non VMTS classe.

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