"Principio de alineación de memoria" del principio subyacente de OC

1.jpeg

  • [análisis de desarrollo de memoria del sistema calloc]
  • [Cuáles son los factores que afectan el tamaño del objeto]
  • [principio de alineación de memoria]

introducción al problema

3.jpg

打印结果0x1005bf7b0> - 8 - 40 - 48

Aquí tenemos que intentar explorar el código fuente de malloc

5.jpg

源码地址各个可调试的版本都有 非常推荐github.com/LGCooci/KCC…

análisis del código fuente calloc

código y proceso6.jpg

diagrama de flujo calloc

7.png

9.jpg

分析 size是传入过来成员变量的总大小 + 15 左移4位 又移4位返回 总结可以得出对象的内存16字节对齐

Alineación de variables miembro de objeto

struct  LGTruct1{
double a;
char b;
int c;
short d;
}struct1;
复制代码
struct  LGTruct1{
double a;
int b;
char c;
short d;
}struct2;
复制代码

NSLog(@"%lu-%lu",sizeof(struct1),sizeof(struct2));El tamaño de impresión de salida es 24-16; esto nos lleva a pensar por qué ambas estructuras tienen las mismas variables miembro, pero el tamaño de la memoria de salida es realmente diferente. Para comprender este problema, primero comprenda los siguientes aspectos del conocimiento.

Bytes ocupados por cada tipo de tipos C y OC

2.jpg

Principios de alineación de memoria

1. Reglas de alineación de miembros de datos: para los miembros de datos de una estructura (estructura) (o unión (unión)), el primer miembro de datos se coloca donde el desplazamiento es 0, y la posición inicial de cada miembro de datos en el futuro debe ser almacenado a partir del tamaño del miembro. O el tamaño del submiembro del miembro (siempre que el miembro tenga submiembros, como arreglos, estructuras, etc.) comienza con un múltiplo entero (por ejemplo, int es 4 bytes en una máquina de 32 bits, debe almacenarse a partir de una dirección entera múltiplo de 4.

2. Estructura como miembro: si hay algunos miembros de estructura en una estructura, los miembros de estructura deben almacenarse a partir de un múltiplo entero del tamaño del elemento interno más grande (struct a contiene struct b, y b contiene char , int , double y otros elementos, que b debe almacenarse a partir de un múltiplo entero de 8).

3. Obra de acabado: El tamaño total de la estructura, es decir, el resultado de sizeof, debe ser un múltiplo entero del miembro de mayor tamaño que la integra, si es insuficiente se debe rellenar.

Ejemplo de análisis

struct  LGStruct3{
double a;   //8字节 [0-7]
int b;      //4字节 [8-11]
char c;     //2字节 [12-13]  
short d;    //2字节 [14 15]
int e;      //4字节 [16 17 18 19]
struct LGTruct1 str;
}struct3;
复制代码

A continuación, analice la estructura LGTruct1; los miembros de la estructura deben comenzar desde la dirección múltiplo entero de su tamaño de elemento máximo interno para almacenar el tamaño máximo de elemento de LGTruct1 es 8; 24 es un múltiplo entero de 8, por lo que 24 comienza a almacenar;

struct  LGTruct1{
double a; //8字节[24 31]
char b;//2字节 [32 33]
int c;  //4字节 从4字节的整数倍开始[36 39]
short d; //2字节 [40 41]
}struct1;
复制代码

El análisis de tipo anidado de la estructura doble a se basa en el principio de alineación de memoria 1. El primer miembro de datos se coloca en la posición del desplazamiento 0 para almacenar el doble a 8 bytes primero, que es [o-7] para almacenar el doble a;

int b ; Los miembros de la estructura de 4 bytes deben almacenarse a partir de un múltiplo entero del tamaño máximo del elemento interno, [8] es un múltiplo entero de 4, por lo que [8 9 10 11]

carácter c; 2 bytes [12-13]

d corta, 2 bytes [14 15]

entero; 4 bytes [16 17 18 19]

doble a; //8 bytes [24 31]

char b; //2 bytes [32 33]

int c; //4 bytes comienzan desde un entero múltiplo de 4 bytes [36 39]

d corta; //2 bytes [40 41]

Obra de acabado: El tamaño total de la estructura, es decir, el resultado de sizeof, debe ser un múltiplo entero del miembro de mayor tamaño que la integra, si es insuficiente se debe rellenar.

El resultado 48 es un entero múltiplo de 8

NSLog(@"%lu",sizeof(struct3));El resultado es 48;

Resumir

Alineación de memoria Apple tiene un conjunto de reglas para mejorar la eficiencia del almacenamiento y la seguridad de lectura. Además, Apple optimizará el algoritmo de almacenamiento de memoria en consecuencia, reduciendo el número de lecturas y garantizando la seguridad de lectura.

Supongo que te gusta

Origin juejin.im/post/6971718042560495629
Recomendado
Clasificación