tipos significado programacion leaks how for ejemplos define contenedores constantes check c++ memory memory-management valgrind

c++ - significado - valgrind windows



Comprender la cantidad de memoria que C++ asigna (1)

1) Porque los tamaños de sus vectores matriciales (y por lo tanto su huella de memoria) crecen como n 2 , por lo que doblar n lleva a la cuadruplicación del uso de la memoria. Cualquier desviación de la relación exacta (a diferencia de la asintótica ) se debe a diferentes factores (p. Ej., Metadatos utilizados por malloc / std::allocator , método de duplicación del tamaño de bloque utilizado por el vector )

2) Estás empezando a quedarte sin memoria, por lo que Linux está comenzando a buscar algunas páginas ; use --pages-as-heap=yes si desea ver el uso total de la memoria (activa + paginada). (Fuente: http://valgrind.org/docs/manual/ms-manual.html )

Estoy tratando de desarrollar una mejor comprensión de la cantidad de memoria que se asigna en el montón en c ++. He escrito un pequeño programa de prueba que, básicamente, no hace más que llenar una serie de vectores en 2D. Estoy ejecutando esto en una máquina virtual Linux de 64 bits y uso la herramienta de macizo valgrind para perfilar la memoria.

El entorno en el que estoy ejecutando esta prueba: Linux VM ejecutándose en VirtualBox en Win10. Configuración de VM: memoria base: 5248MB, 4CPU''s, cap Al 100%, VDI tipo disco (almacenamiento alocated dinámicamente).

Programa de prueba de perfil de memoria c ++:

/** * g++ -std=c++11 test.cpp -o test.o */ #include <string> #include <vector> #include <iostream> using namespace std; int main(int argc, char **arg) { int n = stoi(arg[1]); vector<vector<int> > matrix1(n); vector<vector<int> > matrix2(n); vector<vector<int> > matrix3(n); vector<vector<int> > matrix4(n); vector<vector<int> > matrix5(n); vector<vector<int> > matrix6(n); vector<vector<int> > matrix7(n); vector<vector<int> > matrix8(n); for (int i=0; i<n; ++i) { for (int j=0; j<n; ++j) { matrix1[i].push_back(j); } } for (int i=0; i<n; ++i) { for (int j=0; j<n; ++j) { matrix2[i].push_back(j); } } for (int i=0; i<n; ++i) { for (int j=0; j<n; ++j) { matrix3[i].push_back(j); } } for (int i=0; i<n; ++i) { for (int j=0; j<n; ++j) { matrix4[i].push_back(j); } } for (int i=0; i<n; ++i) { for (int j=0; j<n; ++j) { matrix5[i].push_back(j); } } for (int i=0; i<n; ++i) { for (int j=0; j<n; ++j) { matrix6[i].push_back(j); } } for (int i=0; i<n; ++i) { for (int j=0; j<n; ++j) { matrix7[i].push_back(j); } } for (int i=0; i<n; ++i) { for (int j=0; j<n; ++j) { matrix8[i].push_back(j); } } }

Ejecuto el siguiente script bash para extraer perfiles de memoria a diferentes valores de n (test.o es el programa anterior, compilado con g ++ -std = c ++ 11, g ++ es la versión 5.3.0)

valgrind --tool=massif --massif-out-file=massif-n1000.txt ./test.o 250 valgrind --tool=massif --massif-out-file=massif-n1000.txt ./test.o 500 valgrind --tool=massif --massif-out-file=massif-n1000.txt ./test.o 1000 valgrind --tool=massif --massif-out-file=massif-n2000.txt ./test.o 2000 valgrind --tool=massif --massif-out-file=massif-n4000.txt ./test.o 4000 valgrind --tool=massif --massif-out-file=massif-n8000.txt ./test.o 8000 valgrind --tool=massif --massif-out-file=massif-n16000.txt ./test.o 16000 valgrind --tool=massif --massif-out-file=massif-n32000.txt ./test.o 32000

Esto me da los siguientes resultados:

|--------------------------------| | n | peak heap memory usage | |-------|------------------------| | 250 | 2.1 MiB | | 500 | 7.9 MiB | | 1000 | 31.2 MiB | | 2000 | 124.8 MiB | | 4000 | 496.5 MiB | | 8000 | 1.9 GiB | | 16000 | 6.2 GiB | | 32000 | 6.1 GiB | |--------------------------------|

Cada matriz tendrá un tamaño n ^ 2, tengo un total de 8 matrices, por lo tanto, esperaba que el uso de la memoria fuera de f(n) = 8 * n^2 .

Pregunta 1 De n = 250 a n = 8000, ¿por qué el uso de memoria se multiplica más o menos por 4 a n * = 2?

De n = 16000 a n = 32000 algo muy extraño está sucediendo porque valgrind realmente informa una disminución de la memoria.

Pregunta 2 ¿Qué está pasando entre n = 16000 yn = 32000, cómo puede ser posible que la memoria del montón sea menor, mientras que en teoría se deberían asignar más datos?

Vea a continuación la salida de visualización de macizo para n = 16000 yn = 32000.