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?
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 –
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
@NO_NAME Non so che cosa significa per te, ma non è quello che significa per me. Hai letto la mia domanda? –