x86 - segmentacion - segmentar
¿Puede el almacenamiento estático(principalmente segmento de datos) causar fallas de segmentación? (4)
A medida que se ejecutan tantos foo () s, se introducirán muchas variables estáticas en el segmento de datos.
No. Solo obtienes un foo()::a
. Esa es una especie de todo el punto.
El compilador tomará la inicialización lenta también en la cuenta mientras asigna espacio para el segmento de datos. Si ''No'', ¿causará una falla de segmentación en el tiempo de ejecución mientras el código se está ejecutando? (es más probable que suceda cuando hay muchos datos estáticos dentro de los métodos de plantilla).
Parece que se está preguntando si la sección .data
se quedará sin espacio (y, por tanto, las escrituras posteriores pueden causar errores de corrupción) si tiene demasiados objetos static
.
Bueno, como se señaló anteriormente, en tiempo de compilación se sabe cuánto espacio necesitará para el almacenamiento estático (también para las instancias de plantillas de funciones). No obtiene más foo()::a
cada vez que llama a la función, por lo que no hay elemento en tiempo de ejecución para determinar cuánto espacio se requerirá.
static
almacenamiento static
se decide en el momento de la compilación. Sin embargo, considere el escenario en el que tenemos muchas funciones de inicialización diferida:
void foo ()
{
static int a[1000];
}
No estoy discutiendo la práctica de codificación aquí, sino el aspecto técnico. Como se ejecutan muchas otras funciones como foo()
, se introducirán muchas variables static
en el segmento de datos.
El compilador tomará la inicialización lenta también en la cuenta mientras asigna espacio para el segmento de datos . Si ''No'', ¿causará una falla de segmentación en el tiempo de ejecución mientras el código se está ejecutando? (es más probable que suceda cuando hay muchos datos static
dentro de los métodos de template
).
1) no habrá "muchas" variables para una cosa. una variable estática en el alcance de la función / método es muy similar a una variable global.
2) no hay init flojo, ya que lo más probable es que se inicialice durante el inicio de la aplicación, junto con todas las demás variables globales.
3) No veo ninguna razón para una falla
EDITAR: declaración eliminada acerca del cero hacia fuera
Respuesta corta: no, no segfault.
En el siguiente ejemplo, abc
está en el segmento Datos y def
y x
están en BSS.
#include <iostream>
int abc = 123;
int def;
int foo (int i) {
static int x (i);
return x;
}
int main () {
std :: cout << foo (100) << " " << foo (200);
}
Este ejemplo muestra "100 100": la inicialización de static
objetos static
ámbito de la función ocurre solo durante la primera invocación.
El almacenamiento para x
es lo mismo que si se tratara de una variable global como def
.
Las plantillas son básicamente las mismas, excepto si foo
fue parametrizado por las plantillas, habría una x
para cada instancia.
Solo porque la inicialización es floja, la asignación no lo es. El estándar requiere que todas las variables estáticas (incluidas las variables locales) sean inicializadas en cero antes del inicio del programa. Y, de hecho, estático significa exactamente eso (en este caso): el espacio para la variable está presente durante toda la vida del programa.