2020 bytes latiendo uno al lado del otro

1. Mecanismo de expansión vectorial

En C ++, los elementos del vector se almacenan en la memoria secuencialmente. Cuando el espacio solicitado por el vector está ocupado por los elementos, debe solicitar una nueva memoria vacía y más grande. , La sobrecarga de la CPU es relativamente grande. Para resolver este problema, el tamaño de la nueva aplicación de memoria en C ++ es mucho mayor que el original, en lugar de solo un elemento más grande, copie los elementos de la dirección anterior a la nueva dirección. En términos generales, el vector en gcc se expande dos veces. Después de la expansión, debido a que el vector se movió al nuevo espacio de memoria, el iterador original no será válido. Además, insertar, agregar y copiar causará la expansión del vector.

2. ¿Por qué no inicializar la variable en el constructor?

Cuando el objeto de clase es una variable global, el valor inicial es 0 cuando se carga el sistema. Cuando el objeto de clase es una variable local, el espacio se asigna en la pila y el valor de la variable miembro no está definido. Cuando se llama a la función, la pila asignará una parte del espacio para almacenar las variables locales (incluidos los parámetros) en la función, cuál es el contenido original en este espacio de almacenamiento recién asignado, cuál es el contenido inicial de la variable local, por lo que la variable local inicial El valor es impredecible.

3. Inicialización de constructores y objetos.

El constructor no debe asignar espacio de memoria al objeto, sino inicializar el espacio de memoria asignado.

4. Asignación de espacio de memoria C ++

La memoria C ++ se divide en 5 áreas, montón, pila, área de almacenamiento libre, área de almacenamiento global y área de almacenamiento constante.

Pila: cuando se ejecuta la función, las unidades de almacenamiento de variables locales en la función se pueden crear en la pila, y estas unidades de almacenamiento se liberan automáticamente cuando finaliza la ejecución de la función. La operación de asignación de memoria de pila está integrada en el conjunto de instrucciones del procesador, que es muy eficiente, pero la capacidad de memoria asignada es limitada.

Montón: estos son los bloques de memoria asignados por new, su compilador de lanzamiento no le importa, y está controlado por nuestra aplicación, generalmente un nuevo corresponde a una eliminación. Si el programador no lo libera, el sistema operativo lo reciclará automáticamente una vez que finalice el programa.

Área de almacenamiento de código: código de tienda

Área de almacenamiento global: se almacenarán las variables globales y las variables estáticas.

Área de almacenamiento constante: almacena constantes y no se puede modificar.

La diferencia entre el montón y la pila:

Montón Pila
Método de gestión Gestión del compilador Manual del programador
Tamaño del espacio Mayor espacio Menos espacio
Problema de fragmentación nuevo / eliminar causará discontinuidad de espacio Sal primero, sin escombros
Dirección de crecimiento Crecimiento al alza Crecimiento a la baja
Método de distribución Asignación dinámica Asignación estática + asignación dinámica
Eficiencia de distribución Baja eficiencia Alta eficiencia
5. Mecanismo de memoria de objetos
  1. Cree estáticamente un objeto : si declara un objeto directamente con A a, el compilador asigna memoria para el objeto en el espacio de la pila moviendo directamente el puntero superior de la pila, moviendo el espacio apropiado y luego (el compilador) en este espacio de memoria Llame al constructor para formar un objeto de pila. Usando este método, llame al constructor de la clase directamente. Cuando termina de usar, el compilador llama automáticamente al destructor para liberar la memoria de la pila.
  2. Crear objetos dinámicamente : use el nuevo operador para crear objetos en el espacio de almacenamiento dinámico . Este proceso se divide en dos pasos: el primer paso es (el compilador) ejecuta la función new () del operador, busca la memoria adecuada en el espacio de almacenamiento dinámico y la asigna; el segundo paso es llamar al constructor para construir el objeto e inicializar el espacio de memoria. Este método llama indirectamente al constructor de la clase. Cuando se usa el objeto, eliminar también llamará al destructor para liberar la memoria en el montón
  3. Variables miembro de clase no estáticas: colocadas en el espacio de memoria del objeto
  4. Variables miembro de clase estática: ubicadas en el área de almacenamiento global constante
  5. Función de miembro ordinario: se considera como una función global del alcance de la clase y se almacena en el área de código.
  6. Función virtual: almacena el puntero de función virtual (4 bytes) en el espacio de memoria del objeto.
  7. Tabla de funciones virtuales: la tabla de funciones virtuales se puede determinar en tiempo de compilación, por lo que se almacena en el área de almacenamiento estático, similar al miembro estático de la clase.
6. Cálculo del tamaño de la clase:
  1. Clase vacía: el tamaño de la clase vacía es 1, y el compilador agregará un byte a la clase vacía, de modo que después de la instanciación, la clase pueda tener una dirección única.
  2. Clases que contienen solo funciones virtuales : el tamaño del puntero de la función virtual es de 4 bytes, por lo que el tamaño del objeto es de 4 bytes.
  3. Herencia virtual: el tamaño del puntero de la clase base virtual es de 4 bytes.
  4. Clases que contienen miembros de datos : alineación de bytes
7. La diferencia entre new y malloc
nuevo malloc
Tipo de retorno Puntero de tipo de objeto nulo *, conversión forzada
La asignación falló excepción bac_alloc NULO
Parámetro No es necesario especificar el tamaño Tamaño especificado
Área de memoria Área de almacenamiento gratuito Montón
Expansión de memoria Incapaz de expandirse Use realloc
Sobrecarga Se puede sobrecargar No admite sobrecarga
8. Proceso de ejecución de archivos C ++ (enlace estático y enlace dinámico)

Enlace estático: enlaza archivos relacionados para formar una biblioteca estática y conéctate con el archivo de destino como una unidad.

Enlace dinámico: la idea básica del enlace dinámico es dividir el programa en partes relativamente independientes de acuerdo con los módulos y vincularlos para formar un programa completo cuando el programa se está ejecutando, en lugar de vincular todos los módulos del programa en enlaces estáticos Un archivo ejecutable separado. Ahorro de espacio, pero la vinculación es muy lenta en tiempo de ejecución.

Supongo que te gusta

Origin www.cnblogs.com/hang-shao/p/12734782.html
Recomendado
Clasificación