Preguntas de la entrevista sobre seguridad móvil: conceptos básicos de programación

función estática, variable local y variable global en qué segmento, todas las variables locales deben colocarse en la pila, en casos especiales

función estática
En lenguaje C, la palabra clave estática se puede utilizar para decorar funciones y variables. Aquí discutimos principalmente el caso de funciones modificadas estáticas.
Una función estática (función estática) solo se puede utilizar en el archivo fuente donde está definida y su alcance de acción se limita al archivo fuente actual. Esto evita conflictos de nombres y mejora la capacidad de mantenimiento del código. En otros archivos fuente, no se puede acceder a las funciones estáticas por el nombre de la función.
¿En qué segmento se colocan las variables locales y las variables globales?
En lenguaje C, el diseño de la memoria de un programa generalmente se divide en los siguientes segmentos:

  1. Segmento de código (Code Segment): almacena el código del programa.
  2. Segmento de datos (Segmento de datos): almacena variables globales inicializadas y variables estáticas.
  3. Segmento BSS (Bloque iniciado por símbolo): almacena variables globales no inicializadas y variables estáticas.
  4. Montón (Heap): utilizado para la asignación de memoria dinámica.
  5. Pila (Stack): se utiliza para almacenar información de contexto para variables locales y llamadas a funciones.

Según la definición de estos segmentos de memoria, las variables locales generalmente se almacenan en la pila y las variables globales se almacenan en el segmento de datos o segmento BSS dependiendo de si están inicializadas o no.
¿Deben colocarse las variables locales en la pila?
En la mayoría de los casos, las variables locales se colocan en la pila. Sin embargo, en algunos casos especiales es posible que las variables locales no se asignen en la pila. Un ejemplo típico es una variable local declarada con el modificador de clase de almacenamiento _Thread_local en el estándar C11. Estas variables tienen espacio de almacenamiento independiente en cada subproceso, por lo que normalmente no se asignan en la pila. Por ejemplo:

void some_function() {
    
    
    _Thread_local int local_var; // 这个局部变量不会分配在栈上
}

Además de esto, las optimizaciones del compilador también pueden afectar la ubicación de almacenamiento de las variables locales. Por ejemplo, el compilador podría colocar algunas variables locales en registros en lugar de asignarlas en la pila. Esta situación depende de las opciones de implementación y optimización del compilador.

Diseño de objetos de memoria C ++ (función, función virtual, función virtual pura), ¿cuál es la dirección de llamada de la función miembro?

  • Las funciones miembro ordinarias no ocupan la memoria del objeto, se almacenan en el segmento de código. Al llamar a una función miembro ordinaria, el compilador determinará la dirección de la llamada en el momento de la compilación.
  • Si una clase contiene funciones virtuales, el diseño de la memoria del objeto contendrá un puntero de tabla de funciones virtuales (vptr), que apunta a la tabla de funciones virtuales (vtable). La tabla de funciones virtuales es una matriz de punteros de funciones que almacena las direcciones de funciones virtuales. Al llamar a una función virtual, la dirección de la función se determinará mediante el puntero de la tabla de funciones virtuales.
  • Una función virtual pura no se implementa y su posición en la tabla de funciones virtuales se completará con 0. La clase derivada necesita implementar esta función virtual pura; de lo contrario, la clase también se convertirá en una clase abstracta y no se puede crear una instancia.

La diferencia entre la pila Java y la pila C

  • La pila de Java es parte de la máquina virtual Java (JVM) y se utiliza para almacenar información como variables locales y pilas de operandos de llamadas a métodos Java. La pila C es un área de memoria administrada por el sistema operativo y se utiliza para almacenar variables locales e información de llamadas para llamadas a funciones C/C++.
  • La pila Java admite la administración automática de memoria (como la recolección de basura), mientras que la pila C requiere que los programadores administren la memoria manualmente, lo que es propenso a problemas como pérdidas de memoria y desbordamientos de pila.
  • Los tipos de datos en la pila Java están limitados por la especificación JVM, mientras que la pila C tiene mayor flexibilidad y puede almacenar varios tipos y estructuras de datos.

¿Diferencia entre Java y C++ orientado a objetos?

  • Herencia: Java admite herencia única, una clase solo puede heredar una clase principal; C++ admite herencia múltiple, una clase puede heredar varias clases principales.
  • Clases e interfaces abstractas: en Java, una clase abstracta puede contener métodos abstractos y métodos concretos, y una interfaz solo puede contener métodos abstractos; en C++, solo hay clases abstractas y ningún concepto de interfaz.
  • Control de acceso: Java admite cuatro caracteres de control de acceso: público, protegido, privado y predeterminado (acceso a paquetes); C++ admite tres caracteres de control de acceso: público, protegido y privado.
  • Gestión de la memoria: Java admite la gestión automática de la memoria (recolección de basura) y C++ requiere que los programadores administren la memoria manualmente, incluidas las operaciones de nueva/eliminación.
  • Puntero: Java no admite punteros directamente, y una variable de tipo de referencia es en realidad una referencia a un objeto; C++ admite punteros y referencias, lo que proporciona más capacidades de operación de bajo nivel.

¿Diferencia entre montón y pila?

  • Método de administración: el montón es un área de memoria asignada dinámicamente y los programadores deben solicitar y liberar memoria manualmente; la pila es un área de memoria asignada y recuperada automáticamente, que es administrada por el entorno de ejecución del sistema operativo o lenguaje de programación.
  • Contenido de almacenamiento: el montón se usa principalmente para almacenar objetos y datos asignados dinámicamente; la pila se usa principalmente para almacenar variables locales e información de llamada de llamadas a funciones.
  • Ciclo de vida: el programador controla el ciclo de vida de los datos en el montón y puede abarcar múltiples llamadas a funciones; el ciclo de vida de los datos en la pila comienza y termina con la llamada a la función, y las variables locales se destruyen cuando la función regresa.
  • Velocidad de acceso: la velocidad de acceso a la pila suele ser más rápida que la del montón, porque la pila tiene un orden de acceso fijo (último en entrar, primero en salir, LIFO) y el registro de la CPU apunta a la parte superior de la pila, mientras que la memoria El acceso al montón puede implicar operaciones de gestión de memoria más complejas.
  • Espacio de memoria: el espacio de memoria del montón suele ser mayor que el de la pila, porque el montón se usa para almacenar objetos asignados dinámicamente y puede requerir más memoria; el espacio de memoria de la pila es relativamente pequeño porque solo se usa para almacenar datos temporales para llamadas a funciones.
  • Problema de fragmentación: el montón es propenso a la fragmentación de la memoria, porque la asignación y liberación de la memoria del montón es discontinua; la pila no es fácil de generar fragmentación de la memoria, porque la asignación y liberación de la memoria de la pila son continuas.

Supongo que te gusta

Origin blog.csdn.net/u010671061/article/details/132289575
Recomendado
Clasificación