Roger ya mostraba cómo utilizar SizeOf método de la unsafe paquete. Asegúrese de leer esto antes de confiar en el valor devuelto por la función:
El tamaño no incluye ninguna memoria referenciada posiblemente por x. Para la instancia , si x es un sector, Sizeof devuelve el tamaño del descriptor de segmento , no el tamaño de la memoria a la que hace referencia el segmento.
Además de esto quería explicar cómo se puede calcular fácilmente el tamaño de cualquier estructura utilizando un par de reglas simples. Y luego, cómo verificar tu intuición usando un útil service.
El tamaño depende de los tipos que la componen y el orden de los campos en la estructura (porque se utilizará diferente relleno). Esto significa que dos estructuras con los mismos campos pueden tener diferentes tamaños.
Por ejemplo este struct tendrá un tamaño de 32
struct {
a bool
b string
c bool
}
y una ligera modificación tendrá un tamaño de 24 (una diferencia 25% simplemente debido a un ordenamiento más compacta de campos)
struct {
a bool
c bool
b string
}
Como se puede ver en las imágenes, en el segundo ejemplo hemos eliminado uno de los rellenos y se trasladó un campo para aprovechar el relleno anterior. Una alineación puede ser 1, 2, 4 u 8. Un relleno es el espacio que se usó para completar la variable para llenar la alineación (básicamente espacio desperdiciado).
Sabiendo esta regla y recordando que:
- bool, INT8/uint8 tomar 1 trozo
- Int16, uint16 - 2 trozos
- int32, uint32, Float32 - 4 trozos
- Int64, uint64, float64, puntero - 8 trozos
- cadena - 16 trozos (2 alineaciones de 8 trozos)
- cualquier rebanada toma 24 trozos (3 alineaciones de 8 trozos). Entonces
[]bool
, [][][]string
son lo mismo (no olvide volver a leer la cita que agregué al principio)
- matriz de longitud
n
toma n
* tipo de toma de fragmentos.
Armado con el conocimiento de relleno, alineación y trozos se puede averiguar rápidamente cómo mejorar su estructura (pero todavía tiene sentido verify your intuition using the service).
El OP dijo específicamente "Intenté' inseguro.Sizeof' y no funcionó ". –
si no se trabaja con 64 bittsts, entonces se debe alojar como un error. El uso de .saf no seguro aparece en muchos lugares en el código de la biblioteca Go y tiene la intención de ser una forma canónica de hacerlo, especialmente cuando se hace interfaz con bibliotecas C y llamadas a la API del sistema operativo. En cualquier caso, ciertamente funciona correctamente en el código que he escrito al usarlo. – RogerV
Así que lo comprobé con el código que se muestra a continuación. El OP estaba equivocado. El inseguro. Sizeof devuelve correctamente 24 para su estructura de datos de ejemplo. (Mi compilador de Go se actualiza primera semana de enero de 2010.) paquete principal de importación ( insegura "inseguro" FMT "FMT" ) tipo Coord3d struct {X, Y, Z} Int64 func principal() { var pt Coord3d; const size = insafe.Sizeof (pt); fmt.Printf ("Tamaño de Coord3d:% d \ n", tamaño) } – RogerV