I metodi di una classe sono memorizzati solo una volta in memoria? [chiuso]

4

Quando creo un'istanza di una classe, il sistema alloca la memoria per tutte le variabili di istanza della classe. Alcune lingue potrebbero chiamarle campi o proprietà.

Ma per quanto riguarda il codice dei metodi di classe? Anche quelli sono duplicati o ho il codice solo una volta in memoria? So che tutte le istanze hanno i propri valori, anche all'interno dei metodi, ma mi piacerebbe sapere il codice.

Sono presenti variabili di istanza e separati "metodi di istanza"?

    
posta Holli 28.08.2014 - 20:56
fonte

5 risposte

5

In parole povere:

  • I metodi non fanno parte dello "stato" di un oggetto
  • Fanno parte del progetto
  • Fanno parte del cookie cutter, non della pasta
  • Appartengono alla classe, non all'istanza
  • Quindi immagino che siano memorizzati in memoria una volta
risposta data 28.08.2014 - 20:59
fonte
5

Do I have instance variables and separate "instance methods"?

Generalmente no. I metodi appartengono alla classe stessa e assomigliano ai metodi di estensione C # sotto il cofano:

void Foo(this T instance, param, param, param)

in modo che x.Foo(a,b,c) venga effettivamente chiamato come Foo(x,a,b,c) . Detto questo, alcune lingue / implementazioni consentono di sostituire i metodi, quindi può allocare spazio per un puntatore a quale Foo da usare, ma anche in quei casi il linguaggio rende quei metodi look come variabili (poiché sono effettivamente variabili).

    
risposta data 28.08.2014 - 21:01
fonte
1

Il codice fa parte dei dati statici associati alla classe.

Tipicamente, la classe eEach ha una tabella delle funzioni che fa riferimento alle funzioni virtuali (alias sovrascrivibili) e ogni oggetto ha un puntatore alla tabella delle funzioni della sua classe di istanza. Pertanto, la raccolta di metodi di istanza viene combinata in un singolo puntatore nell'oggetto.

Quindi quando si chiama un metodo il compilatore guarda nella tabella dell'oggetto e trova la funzione corretta.

    
risposta data 28.08.2014 - 21:07
fonte
1

Il compilatore potrebbe inline il tuo codice, ma la copia che produce non viene passata con l'istanza. La copia è fisicamente memorizzata nel codice del sito di chiamata. Allo stesso modo i modelli creano una copia duplicata (ad eccezione dei tipi sostituiti) per ogni diverso tipo di modello istanziato, ma non vengono nemmeno passati all'istanza.

In determinate circostanze la memoria dell'istanza conterrà una funzione puntatore , ma non conosco alcuna implementazione linguistica che memorizzi le istruzioni effettive con l'istanza. Anche nelle lingue in cui le funzioni sono di prima classe e concettualmente si sta facendo qualcosa come restituire una chiusura da un'altra funzione, le istruzioni eseguibili vengono memorizzate staticamente, e si sta solo passando un puntatore a quelle istruzioni ea qualunque stato si abbia bisogno nel contesto.

    
risposta data 28.08.2014 - 22:42
fonte
0

Questo non può essere risolto obiettivamente senza conoscere la lingua.

Qui ci sono spiegazioni per due lingue che coprono molti dei punti generalmente importanti.

C ++

In genere, alcuni codici verranno duplicati mentre altri non lo faranno. Ovviamente le funzioni inline saranno duplicate e questo include qualsiasi codice nella dichiarazione di classe implicitamente in linea. Il codice che viene definito separatamente non verrà duplicato.

Le classi di modelli (ad esempio i contenitori STL) sono normalmente duplicate poiché normalmente hanno la dichiarazione e la definizione combinate (vedi punto precedente).

I linker possono eseguire le proprie ottimizzazioni per combinare codice come questo, anche se in pratica non credo che sia comune.

Senza una JVM o una CLR per scimmiottare con la memoria in fase di esecuzione, qualunque cosa sia compilata è altamente probabile che sia ciò che viene caricato in memoria in fase di esecuzione.

Java

Il codice byte non verrà duplicato (cioè nei file .class ). A causa della natura dei file di classe che possono essere compilati e manipolati separatamente, non vi sarà alcuna duplicazione o ottimizzazione tra le classi. Tuttavia, il compilatore JIT è gratuito per il codice inline in fase di runtime, che lo duplicherebbe in memoria.

Fonti: Opzioni Java HotSpot VM - JRockit (ci sono alcuni riferimenti ma poca documentazione ufficiale di Oracle su questo argomento)

    
risposta data 28.08.2014 - 21:37
fonte

Leggi altre domande sui tag