2015-07-21 8 views
7

So che un'istanza di questo C++ classe:Come vengono attributi della classe/campi memorizzati

class A { 
    char c; 
    int iiii; 
    short ss; 
}; 

apparirebbe un po 'come questo in memoria: c| | | |i|i|i|i|s|s| | |

Questo 4/2 lettera annotazione non ha alcun senso (ma credo che il mio punto è chiaro)

1 byte for char, 3 bytes of padding, 4 bytes of int, 2 bytes for the short, e 2 bytes of tail padding (dipendente dalla piattaforma, ma non cambierà la logica)

Da standard C++ (compilatori non sarebbero cambiare l'ordine dei campi nel mio esempio):

membri di dati non statico di una classe (non-union) con lo stesso controllo di accesso (clausola 11) viene allocata in modo che i membri successivi abbiano indirizzi superiori all'interno di un oggetto classe. L'ordine di allocazione dei membri di dati non statici con controllo di accesso diverso non è specificato (clausola 11). I requisiti di allineamento dell'implementazione potrebbero causare l'impossibilità di allocare immediatamente due membri adiacenti ; potrebbero pertanto essere richiesti i requisiti per lo spazio per la gestione delle funzioni virtuali (10.3) e delle classi di base virtuali (10.1).

così, vorrei sapere se è lo stesso per le classi Java, il compilatore può modificare l'ordine per ridurre il riempimento?

+0

Alcune domande simili: http://stackoverflow.com/questions/16456366/why-does-the-size-of-a-class -depends-on-the-order-of-the-the-member-declaration-e http://stackoverflow.com/questions/2006504/c-data-alignment-member-order-inheritance –

+1

La specifica JVM afferma che [* Successive gli elementi sono memorizzati nel file di classe in modo sequenziale, senza riempimento o allineamento *] (https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html). – Turing85

+1

@NO_NAME Non so che cosa significa per te, ma non è quello che significa per me. Hai letto la mia domanda? –

risposta

1

Per prima cosa dare un'occhiata a What do Java objects look like in memory during run-time? e Know Thy Java Object Memory Layout.

Ma suppongo che Java Objects Memory Structure risponda alla tua domanda.

Per salvare un po 'di memoria, la VM di Sun non espone gli attributi dell'oggetto nello stesso ordine in cui sono dichiarati. Invece, gli attributi sono organizzate in memoria nel seguente ordine:

doubles and longs 
ints and floats 
shorts and chars 
booleans and bytes 
references