2011-04-24 12 views
6

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?

+7

¡Qué pregunta tan estúpida! ¡Espero que no hayas conseguido el trabajo! –

+0

@David: O el amigo. –

+1

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

Respuesta

15

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); 
    ... 
*/ 
+0

+1. Inteligente :) .. –

+0

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

+3

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. –

2

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.

+0

¿Qué sucede si necesita memoria respaldada por un archivo? ¿Cómo lo sacas de malloc o nuevo? – LnxPrgr3

1

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; 
     } 
} 
+1

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. –

3

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 (o VirtualAlloc o CreateFileMapping 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.

+0

... o memoria compartida. –

Cuestiones relacionadas