Admito que no tengo un conocimiento profundo de D en este momento, mi conocimiento se basa únicamente en la documentación que he leído y los pocos ejemplos que he probado.D Arrays dinámicos - RAII
En C++ puede confiar en la expresión RAII para llamar al destructor de objetos al salir de su ámbito local.
¿Puede usted en D?
Entiendo que D es un lenguaje recogido de basura, y que también es compatible con RAII. ¿Por qué el siguiente código no limpia la memoria, ya que deja un ámbito entonces?
import std.stdio;
void main() {
{
const int len = 1000 * 1000 * 256; // ~1GiB
int[] arr;
arr.length = len;
arr[] = 99;
}
while (true) {}
}
El bucle infinito está allí para mantener el programa abierto para que las asignaciones de memoria residual sean fácilmente visibles.
A continuación se muestra una comparación de un mismo programa equivalente en C++.
Se puede observar que el C++ limpiado inmediatamente después de la asignación de la memoria (la frecuencia de actualización hace que parezca como si se le asigna menos memoria), mientras que D lo mantuvo a pesar de que había dejado a su alcance.
Por lo tanto, ¿cuándo se realiza la limpieza del GC?
Si no puedo suponer que el GC limpiará la memoria no utilizada, ¿cómo puedo suponer que mi programa no se quedará sin memoria de inmediato? Por ejemplo, si empaqué en dos de los bloques de 2.25GB (diferentes ámbitos) de mi matriz dinámica vector3b, me quedé sin memoria al instante, aunque el GC debería haber reconocido el primero como no utilizado (por RAII). – dcousens
Además, ¿por qué ocurre el mismo problema para las matrices no dinámicas, si no siguen RAII? Aunque, debido al tamaño, pueden asignarse Heap. – dcousens
@Daniel: No, quiero decir, no puede suponer que sucederá en un momento determinado; sucederá * alguna vez *, pero no sabes cuándo. Además, depende de lo que quiere decir con arreglos no dinámicos. Lo que está viendo ahora son matrices ** no **, pero son * sectores * (que son solo un par de longitud y puntero). Las matrices en sí mismas están en la memoria del montón, y sus * rebanadas * se comportan como cualquier otra variable; no tienen un destructor, pero si lo hicieran, se ejecutarían cuando se desasignaran. Entonces, si usas el tipo 'Array', se destruirá a sí mismo porque tiene un destructor. – Mehrdad