Es extremadamente difícil detectar que la pila esté llena, y para nada portátil. Uno de los mayores problemas es que los marcos de pila son de tamaño variable (especialmente cuando se usan matrices de longitud variable, que en realidad son solo una forma más estándar de hacer lo que las personas estaban haciendo anteriormente con alloca()
) por lo que no se pueden usar proxys simples como cantidad de cuadros de pila
Uno de los métodos más simples que es mayoría portátil es poner una variable (probablemente de tipo char
de modo que un puntero a que es un char*
) a una profundidad conocida en la pila y a continuación, medir la distancia desde que apunta a una variable (del mismo tipo) en el marco de pila actual mediante aritmética de puntero simple. Agregue una estimación de cuánto espacio está a punto de asignar, y puede tener una buena idea de si la pila está a punto de explotar. Los problemas con esto son que no se sabe en qué dirección está creciendo la pila (no, ¡no todos crecen en la misma dirección!) Y calcular el tamaño del espacio de la pila en sí mismo es bastante desordenado (se puede Probar cosas como los límites del sistema, pero son realmente bastante incómodas). Además, el factor de pirateo es muy alto.
El otro truco que he visto aplicar en Windows de 32 bits solamente era tratar de alloca()
espacio suficiente y controlar la excepción del sistema que se produciría si había espacio suficiente.
int have_enough_stack_space(void) {
int enough_space = 0;
__try { /* Yes, that's got a double-underscore. */
alloca(SOME_VALUE_THAT_MEANS_ENOUGH_SPACE);
enough_space = 1;
} __except (EXCEPTION_EXECUTE_HANDLER) {}
return enough_space;
}
Este código es muy no portátil (por ejemplo, no contar con ella trabajando en Windows de 64 bits) y la construcción con gcc mayores requiere un poco de ensamblador en línea desagradable en su lugar! El manejo estructurado de excepciones (de lo que se trata) se encuentra entre las artes negras más negras de Windows. (Y no return
desde el interior de la construcción __try
.)
¿Tiene alguna pregunta sobre C o C++? –
¡Creo que no se puede inicializar una matriz en la pila usando variables en C/C++! –
¿Qué tan grande es su información? Sugiero que almacene datos de 100KB + en montón utilizando malloc/free. (Otras personas pueden sugerir incluso una cota inferior) – nhahtdh