Roger già mostrato come utilizzare SizeOf metodo dal unsafe pacchetto. Assicurati di leggere questo prima di fare affidamento sul valore restituito dalla funzione:
La dimensione non include alcuna memoria eventualmente indicata da x. Per l'istanza , se x è una sezione, Sizeof restituisce la dimensione del descrittore della porzione , non la dimensione della memoria a cui fa riferimento la porzione.
In aggiunta a questo ho voluto spiegare come è possibile calcolare facilmente le dimensioni di qualsiasi struttura utilizzando un paio di semplici regole. E poi come verificare il tuo intuito usando un utile service.
La dimensione dipende dai tipi che la compongono e l'ordine dei campi nella struct (perché sarà usato imbottitura diversa). Ciò significa che due strutture con gli stessi campi possono avere dimensioni diverse.
Ad esempio questo struct avrà una dimensione di 32
struct {
a bool
b string
c bool
}
e una lieve modifica avrà una dimensione di 24 (una differenza 25% solo a causa di un ordine più compatto campi)
struct {
a bool
c bool
b string
}


Come si vede dalle immagini, nel secondo esempio abbiamo rimosso uno dei paddings e spostato un campo per sfruttare il riempimento precedente. Un allineamento può essere 1, 2, 4 o 8. Un riempimento è lo spazio utilizzato per riempire la variabile per riempire l'allineamento (spazio sostanzialmente sprecato).
Conoscendo questa regola e ricordando che:
- bool, int8/uint8 prendere 1 pezzo
- Int16, UINT16 - 2 pezzi
- Int32, Uint32, Float32 - 4 pezzi
- Int64, uint64, float64, pointer - 8 blocchi
- stringa - 16 blocchi (2 allineamenti di 8 blocchi)
- qualsiasi sezione richiede 24 blocchi (3 allineamenti di 8 blocchi). Quindi
[]bool
, [][][]string
sono gli stessi (non dimenticare di rileggere la citazione che ho aggiunto all'inizio)
- array di lunghezza
n
prende n
* tipo che prende dei blocchi.
Armati con la conoscenza di imbottitura, allineamento e pezzi si può capire rapidamente come migliorare la vostra struct (ma ancora ha senso verify your intuition using the service).
fonte
2016-06-26 01:01:03
L'OP ha detto in particolare "Ho provato' unssafe.Sizeof' e non ha funzionato. " –
se non funziona con 64 bit inte deve essere inserito come bug. L'uso di non sicuro.Sizeof appare in molti punti nel codice della libreria Go ed è inteso come un modo cannoical per fare ciò, specialmente quando si interfaccia alle librerie C e alle chiamate dell'OS del sistema operativo. Ad ogni modo, sicuramente funziona correttamente nel codice che ho scritto usando. – RogerV
Quindi ho controllato con il codice mostrato di seguito. Il PO era sbagliato. Il non sicuro. Sizeof restituisce correttamente 24 per la sua struttura di dati di esempio. (Il mio compilatore Go è stato aggiornato prima settimana di gennaio 2010.) pacchetto principale importazione ( non sicuro "non sicuro" fmt "fmt" ) tipo Coord3d struct {X, Y, Z Int64} func principale() { var pt Coord3d; const size = unsafe.Sizeof (pt); fmt.Printf ("Size of Coord3d:% d \ n", size) } – RogerV