Haciendo algunos perfiles (mem & de velocidad) Me ha picado el hecho de que win7 parece estar asignando exactamente el doble de RAM que pido ... Tenga en cuenta que este es el primero vez que realizo un perfil tan activo en win7, entonces realmente no sé qué esperar.asignando ram muestra el doble de uso de RAM en el administrador de tareas
Estoy asignando cantidades precisas de RAM en un bucle utilizando una edición expresa de MSVC en win7 (64 bits). La aplicación está compilada y se ejecuta en 32 bits.
Asigné 24 MB de memoria RAM y el administrador de tareas muestra que mi aplicación usa 48MB (en todas las columnas de memoria, incluido el cometido, ya que en realidad estoy copiando en las nuevas regiones). Cuando obtenga 24 más (ahora debería ser 48MB), mi aplicación salta a 96, etc.
Se asignan como 1,000,000 de estructuras de 24 bytes.
He buscado en la red pero no he encontrado nada que coincida exactamente con mis observaciones.
¿Alguien tiene una pista?
Si esto es solo un truco del sistema operativo (¿o incompetencia?), ¿Hay alguna herramienta que pueda darme el consumo real de memoria de un proceso? (es difícil encontrar fugas, cuando la aplicación brota para comenzar ;-)
[----------- editado, información adicional -----------]
Nota (por la ruta en la barra de título de la consola) que estoy construyendo en modo Release (utilizando todas las configuraciones de proyecto "vacías" de MSVC 2010), por lo que no se asigna memoria de "depuración" (que puede ser bastante extenso en algunos proyectos).
aquí es una aplicación de C corta, completa, que ilustra el comportamiento:
#include <stdio.h>
#include <assert.h>
#include <conio.h>
#include <stdlib.h>
typedef unsigned int u32;
typedef struct myStruct MYS;
struct myStruct {
u32 type;
union {
u32 value;
char * str;
void * data;
MYS ** block;
MYS * plug;
};
u32 state, msg, count, index;
};
int main(int argc, char *argv[]){
int i, j;
MYS *ref;
printf ("size of myStruct: %d\n\n", sizeof(MYS));
for(i=0; i < 10; i ++){
printf("allocating started...\n");
for (j = 0; j < 1000000 ; j ++){
ref = (MYS *) malloc(sizeof(MYS));
assert(ref);
memset(ref, 0, sizeof(MYS));
}
printf(" Done... Press 'enter' for Next Batch\n");
_getch();
}
_getch();
return 0;
}
y una imagen que muestra la memoria en mi máquina después de un bucle. Cada dos ejecuciones, ¡agrega ~ 48MB en vez de 24MB!
¿Puedes mostrar la línea donde asignas la memoria? –
¿Estás seguro de que struct tiene realmente 24 bytes? Puede haber una alineación pasando que lo rellena. – davin
Pregunta editada ... Agregué un ejemplo de código completo con detalles de construcción adicionales y una imagen de mi administrador de tareas después de un ciclo. Espero que esto ayude :-) – moliad