2010-11-02 13 views
8

Tengo dos preguntas:¿Hay un asignador que use alloca y que sea compatible con C++ STL?

1) ¿Es posible implementar un asignador que use alloca para asignar memoria en la pila y que sea compatible con C++ STL?

Si hay un código disponible, puede hacerme feliz simplemente indicándome la URL. :-) Si no hay ningún código, tal vez pueda bocetar las funciones asignar y desasignar?

2) Si la respuesta a la pregunta anterior es 'sí', me gustaría entender cómo es posible asignar memoria en la pila para los miembros de la clase. Como ejemplo, considere un

std::vector<int, AllocaAllocator<int> > 

y supongamos que una llamada de la función miembro 'redimensionar' de este vector primero llama 'deallocate' y luego 'asignar' del asignador.

El ámbito desde el cual se llama allocate es el del tamaño de la función miembro. ¿Esto no significa que la memoria asignada se elimina de la pila al final de esa llamada de función?

Saludos cordiales, Bjoern

+3

No puede desasignar el espacio que ha asignado en la pila mediante alloca. La única forma de recuperar la memoria asignada por alloca es salir de la función. – Patrick

+0

¿Esto significa que, si sale de una función, se libera toda la memoria asignada dentro de esa función en la pila a través de alloca? ¿Y esto implica que es imposible usar alloca para asignar memoria a los miembros de la clase? Por lo tanto, ¿es imposible escribir un asignador que use alloca? – Bjoern

+2

Por favor, eche un vistazo a esta pregunta: "En busca de C++ STL-like vector class pero usando stack storage" (http://stackoverflow.com/q/354442) Ya hay algunos comentarios valiosos sobre ese tema. –

Respuesta

5

Bjoern, parece que fundamentalmente ha entendido cómo la pila y el trabajo alloca. Lea acerca de ellos.

Lo que está preguntando es imposible porque la memoria asignada por alloca se "libera" cuando regresa de la función que la asignó (ya diferencia de Patrick dijo que no puede cambiar su comportamiento). Escribo "liberado" porque en realidad no está liberado, simplemente sale del alcance como cualquier otra variable de pila. Entonces usarlo después provoca un comportamiento indefinido.

Supongamos que asignar una parte de la memoria en YourAllocator::allocate que se llama a partir d.push_back():

deque<int, AllocaAllocator> d; 
d.push_back(42); // calls alloca 
printf("Hello\n"); 
printf("%d\n", d[0]); 

La memoria asignada por alloca puede ser sobrescrita por la pila marcos de push_back y printf, por lo que la salida no puede haber 42, puede bloquearse, o cualquier otra cosa.

3

No, este tipo de cosas no es posible. Para empezar, el STL espera asignar más memoria y luego liberar la memoria anterior. ¿Cómo vas a hacer eso en la pila?

Lo único que incluso remotamente equivale a esto es un recolector de basura conservador.

+0

+1 para "el STL espera asignar más memoria, * luego * libera la memoria anterior. ¿Cómo vas a hacer eso en la pila?" –

Cuestiones relacionadas