2010-04-22 29 views
5

Tengo el siguiente trozo de fragmento¡La asignación de la pila falla y la asignación del montón tiene éxito! ¿Es posible?

Class Sample 
{ Obj_Class1 o1; 
    Obj_Class2 o2;}; 

Pero el tamaño de Obj_Class1 y Obj_Class2 es enorme para que el compilador muestra una advertencia "considerar mover un poco de espacio para amontonar". Me pidieron que reemplazara Obj_Class1 o1 con Obj_Class1* o1 = new Obj_Class1(); Pero creo que no sirve de nada realizar este cambio ya que la asignación de montón también fallará si falla la asignación de la pila. ¿Estoy en lo correcto? ¿O tiene sentido hacer este cambio (que no sea suprimir la advertencia del compilador)?

+0

Solo por curiosidad, ¿cuál es el tamaño de las clases? – Naveen

+0

alrededor de 65000bytes ... – Prabhu

+0

Además, en lugar de reemplazar la instancia Obj_Class1 con un puntero, ¿puede cambiar su implementación para asignar sus necesidades en el montón? Incluso cambiarlo a un Pimpl podría ayudar. –

Respuesta

5

Es muy típico que la pila sea más pequeña que el montón. Usan diferentes ubicaciones de memoria. La pila generalmente tiene un tamaño de megabyte (puede cambiarla, pero tenga cuidado) y se asigna por subproceso. El montón puede consumir gigabytes si es necesario.

+0

Pero la pila y el montón crecen uno contra el otro. ¿No es así? – Prabhu

+0

@Prabhu: Sí, pero el tamaño máximo de pila aún está limitado a algo así como 1 megabyte. – sharptooth

+0

@Prabhu: No, no es así. Ese es un buen modelo de explicación para una clase de ciencias de la computación, pero en realidad no hay nada que obligue a ese modelo a ser el que realmente se usa. –

3

La pila generalmente es pequeña y no es adecuada para sostener objetos grandes, mientras que el montón está separado y diseñado para ellos.

En su muestra, probablemente debería asignar toda la Sample en el montón, no sus miembros:

int main() { 
    Sample* sample = new Sample(); 
} 
2

En caso de Visual Studio, cada hilo por defecto obtiene 1 MB de espacio, y si se intenta asigna más de lo que obtendrás un error de desbordamiento de la pila. Heap no tiene esta restricción y la cantidad de memoria que puede asignar depende del espacio continuo más grande disponible en la memoria virtual de proceso. Por lo tanto, no es muy sorprendente que la asignación de pila falle en caso de que los objetos sean realmente enormes.

+0

Nitpick: el desbordamiento de la pila no ocurre cuando se asigna más que el tamaño de la pila, sino cuando se asigna más que el tamaño de la pila disponible. Quiero decir que va a fallar o no dependiendo de cuánta pila ya se usa. – sharptooth

3

pila es bastante pequeño por defecto: http://msdn.microsoft.com/en-us/library/ms686774(VS.85).aspx

El tamaño por defecto de la memoria de pila reservado y comprometido inicialmente se especifica en la cabecera del archivo ejecutable. La creación de hilo o fibra falla si no hay memoria suficiente para reservar o confirmar el número de bytes solicitados. El tamaño predeterminado de reserva de pila utilizado por el vinculador es 1 MB. Para especificar un tamaño de reserva de pila predeterminado diferente para todos los hilos y fibras, utilice la instrucción STACKSIZE en el archivo de definición de módulo (.def). El sistema operativo redondea el tamaño especificado al múltiplo más cercano de la granularidad de asignación del sistema (normalmente 64 KB). Para recuperar la granularidad de asignación del sistema actual, use la función GetSystemInfo.

Cuestiones relacionadas