Domanda

In C ++ l'identificatore di classe di archiviazione statico alloca memoria dall'area dati. Cosa significa "area dati" significa?

È stato utile?

Soluzione

Oltre a ciò che Konrad ha detto, dichiarare una variabile come statica significa sostanzialmente che la memoria per essa viene allocata con il programma mentre viene caricata, al contrario dell'heap o dello stack. Storicamente, l'uso di sole variabili statiche in applicazioni critiche significava che l'impronta di memoria dell'applicazione non sarebbe cambiata in fase di esecuzione e quindi era meno probabile che fallisse a causa delle limitazioni delle risorse. Non so se questo è ancora vero per i moderni sistemi operativi.

Se fai in modo che il tuo compilatore generi un file map come parte del suo output, puoi dare un'occhiata a cosa c'è in tutte le varie sezioni, inclusi i dati.

Altri suggerimenti

Non ho familiarità con il termine & # 8220; area dati & # 8221; ma la memoria è spesso divisa in & # 8220; sezione codice & # 8221; e & # 8220; sezione dati & # 8221 ;. Il codice risiede nel primo, i dati nel secondo. Presumo che questo sia ciò che si intende qui.

Classicamente, non c'è distinzione tra i due. Tuttavia, molti sistemi operativi moderni possono vietare l'esecuzione di codice nel segmento di dati (a condizione che la CPU supporti questa distinzione). Questo a volte si applica alla frase di cattura di & # 8220; flag NX & # 8221 ;, come in & # 8220; nessuna esecuzione & # 8221; e può prevenire efficacemente alcuni casi di iniezione di codice dannoso.

/ EDIT: nota che lo standard C ++ non menziona un'area dati & # 8220; & # 8221 ;.

I nomi delle aree variano in base alla piattaforma, al compilatore e al linker.

In generale, ci sono:

  • testo del programma: lo spazio del codice eseguibile.
  • costanti: costanti non eseguibili.
  • stack: lo stack.
  • bss: ampiamente "statica" in termini C / C ++. " Blocco avviato da un simbolo "
  • dati: globi non inizializzati
  • heap: memoria allocata in fase di esecuzione.

In questo caso la documentazione in questione utilizza il nome "area dati" per quello che è tradizionalmente chiamato il segmento bss.

In termini di C, l'identificatore della classe di archiviazione "statico" indica la memoria che esiste per la durata del programma e viene inizializzata su zero o sul valore dell'inizializzatore. Nell'esempio:

static int s_value_one;
static int s_value_two = 123;

Il valore di s_value_one è garantito essere zero e il valore di s_value_type è 123 nel punto della prima istruzione in main (). Il modo in cui ciò diventa realtà è un problema di implementazione.

Cosa ha detto Konrad.

Vorrei aggiungere che ci sono ancora CPU là fuori che non sono in grado di leggere i dati se inseriti nella sezione del codice e viceversa. Questi sono stati più comuni decenni fa, ma sono ancora vivi nel mondo incorporato.

In poche parole, il linker raggruppa solo simboli di uguale tipo insieme. Sul PC spesso hai anche più di semplici aree di codice e dati. Troverai aree per dati non inizializzati, leggi solo dati e altre cose dipendenti dal sistema operativo.

Con poca ricerca su google ho trovato maggiori informazioni su questi argomenti qui:

Ci sono molti posti in cui i dati potrebbero finire. Di solito, le variabili locali sono allocate nello stack e puoi allocare le cose sull'heap usando malloc (o la versione predefinita di 'new'). I dati statici, tuttavia, vengono generalmente allocati all'avvio del programma e potrebbero finire ovunque, dove spetta esattamente al compilatore, al sistema operativo e al formato eseguibile.

Il file eseguibile contiene molte informazioni.

Un eseguibile, ha molti tipi / classi di dati memorizzati nel suo file fisico.

es. sono

  1. Istruzioni sul codice eseguibile
  2. Risorse
  3. Informazioni sulla dipendenza (da cui dipende questo binario)
  4. I simboli esportati da questo binario

etc

Deve esserci un modo per organizzare

tutte queste informazioni all'interno del formato file .exe in modo che il sistema operativo possa facilmente trovare tutte le informazioni e caricare l'eseguibile e far funzionare le cose. A tale scopo, nel mondo di Windows viene utilizzato un formato binario comune (creato da M $ ovviamente) chiamato PE (Portable Executable). Tutte le informazioni che ho appena elencato (e molte altre) sono descritte in dettaglio in diverse sezioni del file binario.

.data section

Una di queste sezioni è la sezione .data. La sezione .data contiene tutti i dati globali e statici inizializzati, mentre la sezione .bss contiene i dati globali non inizializzati.

Perché è necessaria una sezione separata per i globi?

Bene, un globale si comporta come un globale perché è creato in un'area di memoria che esiste per la durata di un programma e non è una struttura di dati temporanea come uno stack che potrebbe essere sovrascritto / riutilizzato. (come le normali variabili automatiche).

Compilatore

Pertanto queste variabili devono essere allocate in qualche indirizzo permanente nell'heap, che purtroppo non può essere conosciuto al momento della compilazione. Quindi il compilatore inserisce tutte le variabili globali e statiche in questa sezione .data / .bss e le istruzioni che fanno riferimento a queste variabili fanno riferimento a questi indirizzi relativamente permanenti in .data / .bss.

Linker

Quando il linker carica l'eseguibile nel mondo reale, decide dove posizionare queste sezioni e crea FIX UP per questi indirizzi temporanei in modo tale che le istruzioni che si riferiscono ai globi si riferiscano agli indirizzi virtuali ora reali nei programmi memoria.

Ora sai qual è la sezione / area .data e perché ai globi è necessario assegnare dello spazio in quell'area e come ciò aiuta il programma in tempo reale. Googling formato PE, linker e sezione .data ecc. Ti procurerebbero i link.

Penso che 'area dati' si riferisca all'heap, mentre le variabili locali si troverebbero normalmente nello stack.

Oppure significa che la memoria allocata per questa variabile si trova nella sezione .data dell'eseguibile, ma sarebbe specifica per Windows e il formato PE.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top