2011-08-18 7 views
12

Dependiendo del compilador el siguiente código:¿Cuáles son los requisitos exactos sobre la duración del almacenamiento automático?

int main() 
{ 
    srand(0); 
    if(rand()) { 
     char buffer[600 * 1024] = {}; 
     printf(buffer); 
    } else { 
     char buffer[500 * 1024] = {}; 
     printf(buffer); 
    } 
    return 0; 
} 

cuando se corrió en un sistema con el tamaño de pila máxima igual a 1 megabyte o bien imprime una cadena vacía o se bloquea con un desbordamiento de pila.

La diferencia se debe a que los diferentes compiladores asignan almacenamiento automático de manera diferente. La mayoría de los compiladores asignan almacenamiento for all objects on function start, por lo que en el código anterior asignan 600 + 400 = 1100 kilobytes y eso conduce al desbordamiento de la pila. Algunos compiladores son más inteligentes y ven que esas dos matrices nunca pueden ser accesibles al mismo tiempo, por lo que reutilizan la misma memoria y solo asignan 600 kilobytes y el programa funciona bien.

ahora el estándar dice (3,7/1) que la duración de almacenamiento define el tiempo de vida potencial mínimo del almacenamiento y luego (3.7.2/1) que el almacenamiento para estos objetos [con duración automática] dura hasta que el el bloque en el que están creados existe.

No entiendo cómo se deben aplicar 3.7/1 y 3.7.2/1 juntos. Uno dice que la duración es potencial mínimo y la otra dice explícitamente que dura hasta que exista el bloque. Parece que, de acuerdo con la primera, ambas estrategias de asignación son legales, pero la segunda exige que solo se use la estrategia de asignación de "reutilización".

¿Cómo coexisten 3.7/1 y 3.7.2/1? ¿Es legal asignar más memoria de la que el programa necesita en el peor de los casos (la primera estrategia)?

+3

1 interesante pregunta. – Sean

+5

Leí 3.7/1 como diciendo "por definición, _storage duration_ especifica un mínimo" y 3.7.2/1 diciendo "la duración de almacenamiento de una variable automática es hasta que el bloque delimitador se cierre". Entonces creo que no hay contradicción y cualquiera de las estrategias es permisible. (De hecho, una implementación de recopilación de basura que en realidad mantiene todo en el montón probablemente sea permisible). – Nemo

Respuesta

6

"Dura hasta que" también es un mínimo.

+0

Entonces, ¿los leo como "la duración mínima es hasta que termina el bloque"? – sharptooth

+0

Correctamente. Tenga en cuenta que incluso si fuera de otra manera, todavía no habría ningún requisito para que el compilador reutilice la ubicación de almacenamiento en la primera oportunidad posible. – MSalters

7

Leí 3.7/como descripción introductoria y definición de los diferentes classe de almacenamiento (automático, estático, dinámico) y no como requisito de implementación para cada ... el requisito de implementación para automatich se describe a continuación en 3.7.2/1.

lectura 3.7.2/1 no prohíbe que existe más largo que existe el bloque (esto es sólo el mínimo) - En mi humilde opinión esta es una abertura para los ejecutores del compilador con respecto a posibles optimizaciones ...

Cuestiones relacionadas