Rust in Action Notas Capítulo 6 Memoria

  1. Option<T>Los tipos utilizan la optimización de puntero nulo en Rust para garantizar que el tipo ocupe 0 bytes en el binario compilado. La variable está representada Nonepor un puntero nulo ;null pointer
  2. La diferencia entre dirección de memoria, puntero y referencia. Una dirección de memoria se refiere a un byte en la memoria, una abstracción proporcionada por el lenguaje ensamblador; un puntero, a veces llamado puntero sin procesar (puntero sin procesar), es una dirección de memoria que apunta a un determinado tipo de datos, y un puntero es una abstracción proporcionada por un lenguaje de alto nivel; una referencia es un puntero. En un tipo dinámico, una referencia contiene un puntero y algunas garantías adicionales. La referencia es una abstracción proporcionada por Rust;
  3. Las referencias de Rust brindan más beneficios que los punteros: las referencias siempre apuntan a datos válidos; la disposición de bytes de las referencias es compacta, lo que ayuda a la CPU a leer rápidamente; las referencias pueden proporcionar garantías de longitud para tipos de datos de longitud variable. Además del puntero interno en sí, la estructura referenciada también proporciona una variable de longitud de datos para garantizar que el programa nunca se ejecute fuera del rango de memoria;
  4. {:p}Puede imprimir el puntero de instalación variable e imprimir su dirección de memoria;
  5. El Listado de Código 6.3 muestra dos formas de convertir un arreglo u8 a una cadena: la variable b primero se String::from_raw_parts(ptr, size, capa)convierte [u8; 10]a *const u8y luego a *mut u8, la variable c se introduce en la interfaz externa de CStr obteniendo CStr::from_ptr(c_ptr)una \0cadena del tipo de lenguaje C que termina en , las variables b y c deben convertirse [u8, n]primero *const u8al tipo de puntero correspondiente requerido por la conversión;
  6. Los punteros sin procesar de Rust se dividen *const Ten *mut Tdos tipos: punteros sin procesar inmutables y punteros sin procesar mutables, que se pueden convertir libremente.El &mut T and &Tresultado compilado por las referencias de Rust se convierte en un puntero sin procesar, es decir, el rendimiento de un puntero desnudo se puede obtener sin inseguridad durante la operación real;
  7. Razones para usar punteros desnudos: uso inevitable, cuando el sistema necesita llamar a funciones del sistema operativo o algunos códigos de terceros necesitan punteros desnudos, generalmente llamadas externas a algunos programas escritos en C, cuando varios lugares necesitan acceder a los datos al mismo tiempo y los requisitos de rendimiento del tiempo de ejecución son extremadamente altos;
  8. El puntero inteligente en C++ corresponde a Rust.El core::ptr::{Unique, Shared, Weak}puntero gordo (fat pointer) generalmente se refiere al diseño de la memoria, que es más grande que el puntero delgado (el puntero delgado, generalmente también se refiere al puntero desnudo, que tiene solo un ancho de uso), generalmente con 2 anchos de uso o incluso más;
  9. core::ptr::UniqueEs un elemento constitutivo en rust String, Box<T>; core::ptr::Sharedes Rc<T>, Arc<T>un elemento constitutivo, si desea implementar su propio puntero inteligente, puede consultar los detalles de implementación de estos punteros inteligentes;
  10. std::rc::Weak, std::arc::WeakSe puede utilizar para estructuras de datos que apuntan entre sí internamente, evitando el problema de los punteros circulares, alloc::raw_vec::RawVecpara la implementación Vec<T>, VecDeq<T>, puede asignar y recuperar memoria de manera inteligente para cualquier tipo de datos, std::cell::UnsafeCellpara la implementación Cell<T>, RefCell<T>, para proporcionar mutabilidad interna (mutabilidad interior);
  11. "En caso de duda, prefiera la pila" significa que cuando no sabe si poner los datos en el montón o en la pila, póngalos primero en la pila, porque la pila es más rápida. La versión de Rust de esta oración es, es decir, el tipo que implementa la función Tamaño se almacenará primero en la pila When in doulbe, use types that implement Sized;
  12. Cómo hacer que una función acepte &str, Stringdos tipos de parámetros al mismo tiempo, puede usar la plantilla de parámetros <T: AsRef<str>>para indicar que el parámetro T se puede llamar una referencia str, para llamar .as_ref().len()al método, vea la página 189 para más detalles;
  13. La tabla 6.1 ofrece una comparación simple entre la pila y el montón. Tenga en cuenta que la tabla muestra que en Rust sin Unsafe, es seguro usar el montón;
    Tabla 6.1
  14. Varios métodos generales para optimizar la asignación de memoria de pila: asigne suficiente espacio por adelantado, inicialícelo en 0 y luego cámbielo a un valor distinto de cero cuando se use. Este método es peligroso y puede desencadenar la verificación del ciclo de vida de Rust; diseñe un asignador para el programa usted mismo, que pueda asignar el espacio requerido de manera más efectiva; investigue y use, permitiendo que los objetos se usen mientras se crean (creados sobre la marcha), arena es una biblioteca de terceros arena::{Arena, TypedArena}, enlace ;
  15. Términos comunes para memoria virtual, página, palabra, error de página, intercambio, memoria virtual, memoria real, tabla de página, segmento, error de segmentación, MMU, TLB (búfer de traducción al lado), consulte la página 203 para obtener más detalles;
  16. La sección 6.4.2 habla sobre la falla de segmentación (falla de segmentación), que ocurrirá al acceder a un área ilegal. Puede consultar el siguiente código para la implementación;
  17. La Sección 6.4.3 habla sobre el papel de la MMU (unidad de daño de memoria), es decir, la traducción de direcciones virtuales en direcciones físicas, y el papel del uso de la memoria caché TLB para acelerar.La página 206 habla sobre algunos pequeños trucos utilizados por el sistema operativo y la CPU en el proceso de traducción de direcciones;
  18. La siguiente figura muestra cómo se carga un archivo ejecutable (ELF) en la memoria virtual y se ejecutainserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Mint2yx4/article/details/131188752
Recomendado
Clasificación