Cuando mi amigo tuvo su entrevista ayer, se le hizo una pregunta: Implemente una función que asigna espacio de memoria sin usar el * alloc o el nuevo operador, y la función debe devolver un puntero a la dirección. Ni él ni yo podemos encontrar la respuesta.¿Cómo asignar espacio de memoria sin utilizar malloc o un nuevo operador?
Respuesta
Creo que la pregunta es más un rompecabezas que una pregunta que muestra la experiencia con la programación. Mi solución sería la asignación de una matriz de bytes mundial, que se utiliza en lugar de la pila:
char heap[MAX_ALLOWED_MEM];
/*
The following function uses 'heap' as raw memory!
void* like_malloc(size_t bytes);
...
*/
+1. Inteligente :) .. –
Sí, lo consideraría más como un rompecabezas, como cómo se puede pensar fuera de la caja. En este tipo de preguntas, es mejor tratar de delinear la mayor cantidad posible de soluciones y discutir sus pros y sus contras, sin importar cuán lejos estén. Identificar más opciones es una medida de su experiencia.La persona que entrevistará hará algún tipo de determinación: 1) no contesta, está bien el nivel de habilidad básico. 2) al menos algunas ideas = algunas habilidades y resolución de problemas, 3) discutir problemas con soluciones que incluyen rendimiento, seguridad de hilos, portabilidad = mayor nivel de experiencia. – DavidN
Esto no tiene nada que ver con pensar fuera de la caja, es una cuestión de conocimiento de programación, ya que esto es más o menos cómo se crea el montón en sistemas simples (puede usar una parte predefinida del mapa de memoria en lugar de dejar el compilador genera un global, una vez que conoces el mapa de memoria). La pregunta es: "¿es usted el tipo de programador con posibilidades de escribir un asignador de memoria, si se le pide que lo haga?", Y el verdadero trabajo consiste en escribir la función (y acompañar a "libre"). Si no lo eres, tal vez quieran un programador de nivel inferior para el trabajo. –
Puede hacerlo a través de una llamada al sistema como sbrk(), en lugar de usar una función de biblioteca C o una característica de lenguaje C++. Sin embargo, no hay absolutamente ninguna razón para hacer esto, así que esta es una pregunta muy mala.
¿Qué sucede si necesita memoria respaldada por un archivo? ¿Cómo lo sacas de malloc o nuevo? – LnxPrgr3
Un súper sencillo que nunca se libera.
class allocator{
static char mem_pool[1048576];
char* place;
public:
allocator(){
place = mem_pool;
}
allocator(const allocator& a){
place = a.place;
}
char* alloc(size_t size){
char* ret = place;
place += size;
return ret;
}
}
Buena idea, pero sería más fácil hacerlo de forma segura en una función con un par de variables locales estáticas. Como es, el constructor de copia invita a las personas a devolver regiones de memoria superpuestas a los llamadores posteriores de alloc. –
Dependiendo de la plataforma que tienen algunas opciones:
- Dado que este es C++, puede engañar y invocar una de las STL allocators. Dudo que eso sea lo que el entrevistador quería, pero ¿quién sabe con certeza?
- Siempre puedes usar pools de tamaño fijo como sugieren algunas de las respuestas.
sbrk
también es una opción, pero se desaconseja su uso y ya no es parte de POSIX.- También puede utilizar
mmap
(oVirtualAlloc
oCreateFileMapping
en Windows) como fuente de memoria, pero si quieres más pequeños trozos de memoria de páginas enteras igual será necesario escribir código para gestionar la memoria estas funciones regreso.
Su asignador de memoria debe garantizar está correctamente alineado para su plataforma: en algunos sistemas, el acceso a memoria no alineada es una operación no válida y en los demás hay un impacto en el rendimiento frente al acceso alineados. En real, el código de producción también es probable que desee proporcionar una operación free
para evitar tomar en toda la memoria del sistema y bloqueo para hacer que su montón sea seguro para subprocesos.
... o memoria compartida. –
- 1. ¿Qué usar - "operador nuevo" u "operador nuevo []" - para asignar un bloque de memoria sin procesar en C++?
- 2. ¿Cómo se sabe cuánto espacio asignar con malloc()?
- 3. Nuevo operador de C++ - diseño de memoria
- 4. ¿Cuándo debo usar malloc para asignar memoria?
- 5. memoria máxima que malloc puede asignar
- 6. nuevo operador para asignación de memoria en el montón
- 7. nuevo o nuevo código de operador []
- 8. ¿Cómo inicializar la memoria con un nuevo operador en C++?
- 9. operador nuevo espacio de nombres dentro
- 10. Sin memoria al asignar cursores
- 11. ¿Puede C++ 0x todavía asignar explícitamente con operador global nuevo?
- 12. usando memoria sin asignar sin error?
- 13. Uso nuevo operador para inicializar una matriz
- 14. Anulando operador global nuevo para rastrear grandes asignaciones de memoria?
- 15. ¿Crear cadenas en D sin asignar memoria?
- 16. ¿Cómo llamo al "operador nuevo" original si lo sobrecargué?
- 17. ¿Asignar memoria al puntero doble?
- 18. C - Devolver un puntero char sin malloc
- 19. C - Malloc y memcpy (gestión de memoria)
- 20. Cómo burlarse del operador 'nuevo'
- 21. Cómo utilizar SIMILARES O operador utilizando CakePHP y MySQL
- 22. Inicializar un objeto con y sin nuevo operador
- 23. ¿Es necesario sobrecargar el nuevo operador de colocación, cuando sobrecargamos un nuevo operador?
- 24. ¿Cómo puedo limitar la memoria adquirida con `malloc()` sin limitar también la pila?
- 25. Convertir un número entero en una cadena sin asignar memoria
- 26. Asignar memoria para un vector
- 27. Use mmap para asignar memoria
- 28. Asignar memoria y guardar cadena en C
- 29. ¿Cuál es la mejor solución para reemplazar un nuevo asignador de memoria en un código existente?
- 30. ¿Es mejor asignar memoria en el poder de dos?
¡Qué pregunta tan estúpida! ¡Espero que no hayas conseguido el trabajo! –
@David: O el amigo. –
Perdón por esta pregunta que hace que se sintieran estúpidos. Sin embargo, obtuve la respuesta y estoy mejorado. Creo que es mejor estúpido que ignorante. – qwerty