C++ pide palabras clave

Discriminación de variables constantes y variables estáticas

estática
Después de cambiar la variable local a una variable estática, cambia su método de almacenamiento, es decir, cambia su vida útil. Cambiar una variable global a una variable estática cambia su alcance y limita su alcance de uso. Por lo tanto, el especificador estático juega diferentes roles en diferentes lugares.

Las variables globales y las variables locales se dividen desde la perspectiva del alcance de las variables.
Las variables estáticas y las variables dinámicas se dividen desde la perspectiva de la asignación de memoria variable.

Las variables globales en sí mismas son métodos de almacenamiento estático y, por supuesto, las variables globales estáticas son métodos de almacenamiento estático. No hay diferencia en los métodos de almacenamiento entre los dos. La diferencia es que el alcance de las variables globales no estáticas es el programa fuente completo. Cuando un programa fuente se compone de varios archivos fuente, las variables globales no estáticas son válidas en cada archivo fuente. de. La variable global estática limita su alcance, es decir, solo es válida en el archivo fuente donde se define la variable y no se puede usar en otros archivos fuente del mismo programa fuente.

Ejemplo 2: ¿Cuál es la diferencia entre las variables globales estáticas y las variables globales ordinarias?

Respuesta: El área de almacenamiento de las variables globales estáticas es la misma que la de las variables globales ordinarias, la diferencia es:

Las variables globales estáticas solo son válidas en el archivo que declara esta variable global estática;

Las variables globales ordinarias son válidas para todo el programa fuente y, cuando el programa fuente contiene más de un archivo, siguen siendo válidas para otros archivos.

Ejemplo 3: ¿Cuál es la diferencia entre variables locales estáticas y variables locales ordinarias?

Respuesta: El área de almacenamiento de variables locales estáticas es un área de almacenamiento estático, y el área de almacenamiento de variables locales ordinarias es una pila;

El ciclo de vida de una variable local estática es todo el programa fuente, pero solo puede ser llamado en la función que lo declara, y su valor está relacionado con el último resultado; mientras que el ciclo de vida de una variable local ordinaria es el ciclo de vida de su función, más allá de un rango específico, el valor será reinicializado;

Si una variable local estática no se inicializa, su valor predeterminado es 0, mientras que una variable local ordinaria no está definida.

Discriminación de variable constante
variable estática

Las variables almacenadas en el área de datos estáticos se inicializarán cuando el programa comience a ejecutarse, y es la única inicialización. Hay dos tipos de variables almacenadas en el área de almacenamiento estática: variables globales y variables estáticas, pero en comparación con las variables globales, la estática puede controlar el rango visible de las variables.Después de todo, la estática todavía se usa para ocultar.

—Con base en los dos puntos anteriores, se puede sacar una conclusión: cambiar una variable local a una variable estática cambia su método de almacenamiento, es decir, cambia su tiempo de vida. Cambiar una variable global a una variable estática cambia su alcance y limita su alcance de uso. Por lo tanto, el especificador estático juega diferentes roles en diferentes lugares.

constante

限定变量为只读常量,不可修改

inserte la descripción de la imagen aquí

parámetros de función modificados const

(1) Los parámetros pasados ​​y el puntero en sí son inmutables en la función, ¡sin sentido!

void func(const int var); // 传递过来的参数不可变
void func(int *const var); // 指针本身不可变

Indica que el parámetro no se puede modificar en el cuerpo de la función, pero no tiene significado aquí, var en sí mismo es un parámetro formal y no cambiará en la función. Lo mismo ocurre con la inclusión del parámetro formal entrante como puntero.
El parámetro de entrada adopta "pasar por valor". Dado que la función generará automáticamente una variable temporal para copiar el parámetro, no es necesario proteger el parámetro de entrada, así que no agregue la modificación constante.

(2) El contenido apuntado por el puntero del parámetro es constante e inmutable

void StringCopy(char *dst, const char *src);

donde src es un parámetro de entrada y dst es un parámetro de salida. Después de agregar la modificación const a src, si la declaración en el cuerpo de la función intenta cambiar el contenido de src, el compilador señalará un error. Esta es una de las funciones de agregar const.
(3) El parámetro es una referencia para aumentar la eficiencia y evitar modificaciones.

void func(const A &a)

estático

inserte la descripción de la imagen aquí

volátil

inserte la descripción de la imagen aquí
Dígale al compilador que el valor de la variable es inestable y puede cambiarse. \nNecesita leer el valor en la memoria en lugar de leer la copia de seguridad en el registro. Una variable
utilizada por varios subprocesos, y el valor de la variable cambiará
Variables no automáticas a las que se accede en la subrutina de servicio de interrupción Características variables
de las variables de registro de hardware de dispositivos paralelos (como registros de estado) Variable no optimizable Indicar al compilador que no realice varias optimizaciones en las variables declaradas por volatile\nSe garantiza que los programadores escriban Las instrucciones en el código debe ejecutarse volátil int a;\na = 1; si no se declara como volátil\n los dos códigos se fusionarán en uno. La ejecución secuencial (atomicidad) garantiza el orden entre las variables volátiles y no se compilará fuera de La optimización de orden se puede usar con const Sí , const es de solo lectura, volátil es para leer de la memoria El puntero puede ser volátil para modificar los parámetros de la función











en línea

inserte la descripción de la imagen aquí

en línea es solo una sugerencia ahora. La función definida en la clase solicita la función en línea en línea
de forma predeterminada para modificar cualquier función. Esta palabra clave es una sugerencia. Le dice al compilador que esta función debe implementarse como una función en línea. Los compiladores modernos más avanzados son compiladores de optimización y ellos mismos deciden qué incluir en línea, por lo que una palabra clave que alguna vez se consideró importante ahora es solo una sugerencia para el compilador.
El compilador expandirá directamente el contenido de la función en línea en cada lugar donde se llame a la función en línea, lo que puede ahorrar la sobrecarga de llamadas a funciones y mejorar la eficiencia. Generalmente, se usa para funciones con códigos relativamente simples en el cuerpo de la función y no
puede contienen controles complejos, sentencias, while, switch y funciones en línea que no pueden llamarse directamente a sí mismas. Si el cuerpo de la función de la función en línea es demasiado grande, el compilador convertirá automáticamente la función en línea en una función ordinaria.
Cuando se llama a una función ordinaria, el sistema primero ejecuta el cuerpo de la función en la dirección de entrada de la función y devuelve Execution continúa en el lugar donde se llama a la función, y la función siempre tiene una sola copia. \n La función en línea no necesita direccionamiento. Cuando se ejecuta la función en línea, la función se expandirá. Si la función en línea se llama N veces en el programa, habrá N veces para expandir el código de función. Características: use espacio Por tiempo
, mejora la eficiencia de las llamadas a funciones.
La diferencia entre definición en línea y macro

	宏定义的替换在预处理时期,而内联函数在编译时期
	宏定义没有类型检查,只是文本替换;内联函数有类型检查,是真正的函数
	宏定义和内联函数使用的时候都是进行代码展开,对于短小的函数,都能提高效率

definición de tipo

给已存在的类型定义一个别名
typedef由编译器解释,不是预处理器
在其受限范围内,typedef比#define更灵活。
与#define不同,typedef创建的符号名之受限于类型,不能用于值。

inserte la descripción de la imagen aquí

externo

使用其他源文件的全局变量和函数,extern int a;

extern "C"
	C是表示编译连接规约
	实现C和C++混合编程

inserte la descripción de la imagen aquí

definición de tipo

给已存在的类型定义一个别名
typedef由编译器解释,不是预处理器
在其受限范围内,typedef比#define更灵活。
与#define不同,typedef创建的符号名之受限于类型,不能用于值。

sizeof sizeof es un símbolo de operación??

以字节为单位返回所指对象所占的内存空间

inserte la descripción de la imagen aquí

La diferencia entre sizeof y strlen()

inserte la descripción de la imagen aquí

punteros salvajes y colgantes

El puntero debe inicializarse cuando se define, puede usar nullptr (c ++) NUL
(c)

inserte la descripción de la imagen aquí

struct estructura unión es más desde la perspectiva del lenguaje C

inserte la descripción de la imagen aquí

reglas de alineación de memoria de estructura de estructura:

struct S2
{
    
    
    char c1;
    int i;
    char c2;
};
printf("%d\n", sizeof(struct S2));

El resultado es 12.
El primer miembro está en la dirección en el desplazamiento 0 de la variable de estructura.
Otras variables miembro deben alinearse con una dirección que sea un múltiplo entero de un número determinado (número de alineación). Alineación = El valor más pequeño entre la alineación predeterminada del compilador y el tamaño del miembro. El valor predeterminado en vs es 8 y el valor predeterminado en Linux es 4.
El tamaño total de la estructura es un múltiplo entero del número máximo de alineación. (Cada variable de miembro tiene su propio número de alineación)
Si una estructura está anidada, la estructura anidada se alinea con un múltiplo entero de su propio número de alineación máximo, y el tamaño total de la estructura es todos los números de alineación máximos (incluidas las estructuras anidadas). Múltiplos enteros de alineación del cuerpo).

¿Por qué existe la alineación de la memoria?
Motivos de la plataforma (motivos de portabilidad):
no todas las plataformas de hardware pueden acceder a datos arbitrarios en cualquier dirección; algunas plataformas solo pueden obtener ciertos tipos de datos en ciertas direcciones

Razones de rendimiento:
las estructuras de datos, especialmente las pilas, deben alinearse en los límites naturales tanto como sea posible. La razón es que para acceder a la memoria no alineada, el procesador necesita hacer dos accesos a la memoria, mientras que un acceso a la memoria alineada requiere solo un acceso.
Desventajas:
No tiene nada de malo: inevitablemente habrá problemas de eficiencia. Este es un enfoque de intercambio de espacio por tiempo, pero este enfoque vale la pena.

class和struct

inserte la descripción de la imagen aquí

区别
	默认访问权限和继承关系不同,class是private,struct是public
	class可以定义模板类形参,比如template <class T, int i>
使用
	类比结构体增加了操作数据的行为,就是函数
	struct用于数据结构集合
	class用于对象的继承多态封装,虽然struct也可以
如何计算结构体长度
	内存对齐问题

Supongo que te gusta

Origin blog.csdn.net/qq_46084757/article/details/127002284
Recomendado
Clasificación