PDA

Visualizza la versione completa : [C++] Tempo inizializzazione variabili globali


Cesaropa12
07-01-2007, 18:35
Se io ho un array di 10 o di 1000 dichiarato come variabile globale, quando avvio il programma, impiegano lo stesso tempo a inizializzarsi gli array o impiegano tempo diverso?
int Arr[10];
int Arr2[1000];

andbin
07-01-2007, 18:53
Originariamente inviato da Cesaropa12
Se io ho un array di 10 o di 1000 dichiarato come variabile globale, quando avvio il programma, impiegano lo stesso tempo a inizializzarsi gli array o impiegano tempo diverso?
int Arr[10];
int Arr2[1000]; Le variabili con durata "fissa" sono allocate al momento della creazione del processo in una area dati. In pratica all'interno dell'eseguibile c'è scritto che il programma ha bisogno di tot bytes da riservare in questa area dati apposita.
Quindi, per venire alla tua domanda: no, nessuna differenza di tempo.

Cesaropa12
07-01-2007, 19:13
Ok. Allo stesso modo volevo sapere se utilizzando il vettore si impiega più o meno tempo. Ma credo che qui la risposta sia differente perchè cio' viene fatto in fase di esecuzione visto che il vettore ha un costruttore.

//Codice dichiarato glibalmente
vector<int> Arr(10);
vector<int> Arr2(1000);

andbin
08-01-2007, 10:27
Originariamente inviato da Cesaropa12
Ok. Allo stesso modo volevo sapere se utilizzando il vettore si impiega più o meno tempo. Ma credo che qui la risposta sia differente perchè cio' viene fatto in fase di esecuzione visto che il vettore ha un costruttore.

//Codice dichiarato glibalmente
vector<int> Arr(10);
vector<int> Arr2(1000); Stesso tempo di esecuzione (più o meno ... non so esattamente cosa fa il costruttore di vector). Si tratta solo di allocare più o meno memoria dinamica a run-time.

Xaratroom
08-01-2007, 18:00
Le variabili con durata "fissa" sono allocate al momento della creazione del processo in una area dati. In pratica all'interno dell'eseguibile c'è scritto che il programma ha bisogno di tot bytes da riservare in questa area dati apposita.

Non ha capito bene il succo ...
Vuoi dire che dichiarando array [100] o array [10] non c'è differenza, in termini di tempo ?
Credo di no, cmq si devono riservare quelle celle ... :master:
Cmq:

Se io ho un array di 10 o di 1000 dichiarato come variabile globale, quando avvio il programma, impiegano lo stesso tempo a inizializzarsi gli array o impiegano tempo diverso?
Essendo un'array più "grande" dell'altro, naturalmente, ci mette più tempo ad essere inizializzato...
O intendevi dichiarato (il c++, se non erro, non inizializza l'array dichiarato)...

andbin
08-01-2007, 18:28
Originariamente inviato da Xaratroom
Vuoi dire che dichiarando array [100] o array [10] non c'è differenza, in termini di tempo ?
Allora, giusto per chiarire:


int arr[10];

int main (void)
{
return 0;
}

oppure


int arr[1000000];

int main (void)
{
return 0;
}
Non cambia praticamente nulla. la variabile 'arr' viene messa nel segmento "bss" dell'eseguibile che è quello dedicato alle variabili non inizializzate. Se provate a compilare i sorgenti sopra, la dimensione dell'eseguibile non cambia ed è comunque piccola (il minimo, insomma, per il tipo di progetto scelto, se con o senza debugging).
Questo perché, per dirla in breve, all'interno dell'eseguibile c'è soltanto scritto che quando il programma verrà caricato in memoria, dovranno essere allocati tot bytes per le variabili non inizializzate.

Ora questo:


int arr[1000000] = { 1 };

int main (void)
{
return 0;
}
Adesso la variabile 'arr' viene messa nel segmento "data" perché è inizializzata. Provate a compilare e vi troverete con un eseguibile parecchio grosso, sicuramente più di 4000000 bytes (intorno ai 4 Megabyte). Questo perché l'intero array è stato allocato in una area di memoria che è fisicamente e realmente presente nel file eseguibile.

Spero che sia chiaro, adesso.

Xaratroom
08-01-2007, 19:19
Si su questo non ci piove....
Intendevo dire che, in termini di tempo di avvio, l'eseguibile che riserva 1000000 celle è più lento di quello che ne riserva 10 ( non inizializzate )....
A maggior ragione se consideriamo anche l'inizializzazione ....

Cesaropa12
08-01-2007, 22:02
Ho visto una struttura che mi è nuova:
int arr[1000000] = { 1 };

Significa 100000 di elementi di arr inizializzati a 1? Se si è ovvio che in questo caso deve scrivere in ogni cella e ci mette non poco...

Xaratroom
08-01-2007, 22:09
Solo il primo elemento...
es:

int arr [100] = {1,2,3,4,5};

arr

1 2 3 4 5 ...

Xaratroom
08-01-2007, 22:10
Prova:



#include <iostream.h>
#include <stdlib.h>
int arr [10] = {1,2,3,4,5};

int main (void)
{

for (unsigned int i = 0; i < 10; i++)
cout << arr [i] << endl;

system ("pause");
return 0;
}

Loading