[C] Dimensione massima di un vettore

di il
22 risposte

[C] Dimensione massima di un vettore

Mi chiedevo quale fosse il massimo numero di elementi in un vettore.
Dipende dal tipo di dati in esso contenuti?

22 Risposte

  • Re: [C] Dimensione massima di un vettore

    Dipende da dove lo allochi. Se lo dichiari come una variabile locale nel corpo di una funzione (esempio, dichiari "char vec[100] ;") il vettore viene posto sullo stack, che bisogna pensare avere un ordine di grandezza dei kbytes. In caso venga sforata la dimensione si provoca l'errore di stack overflow che è sempre una grana e porta generalmente al crash del programma. Se nella stessa funzione di cui sopra lo dichiari "static char vec[100000];" oppure come globale verrà allocato nella RAM disponibile, così come se lo crei tramite la famiglia "malloc" e soci. In questi casi il limite è la RAM ed eventualmente il file di swap, ma parliamo di numeri assolutamente "di principio".

    Immagino che per numero di elementi di vettore ti riferisca invece/oppure al numero che si può mettere tra le parentesi quadre. A quanto ne so al di là di tutti i typedef di questo mondo, anche stavolta diventa una questione di principio dato che seppure si possa contare su un size_t che equivale almeno a un long, se devi indirizzare più del valore massimo di un long (anche in una macchina a 32 bit) in un solo vettore evidentemente c'è qualcosa di molto sbagliato nella codifica. Suppongo che ci possano essere eccezioni e non mi stupirei se esistessero circostanze in cui questi limiti vengano superati, forse qualcuno lo saprà e potrà dirlo.
  • Re: [C] Dimensione massima di un vettore

    Grazie mille per la risposta
  • Re: [C] Dimensione massima di un vettore

    Alan_Reloaded ha scritto:


    Dipende da dove lo allochi. Se lo dichiari come una variabile locale nel corpo di una funzione (esempio, dichiari "char vec[100] ;") il vettore viene posto sullo stack, che bisogna pensare avere un ordine di grandezza dei kbytes. In caso venga sforata la dimensione si provoca l'errore di stack overflow che è sempre una grana e porta generalmente al crash del programma. Se nella stessa funzione di cui sopra lo dichiari "static char vec[100000];" oppure come globale verrà allocato nella RAM disponibile, così come se lo crei tramite la famiglia "malloc" e soci. In questi casi il limite è la RAM ed eventualmente il file di swap, ma parliamo di numeri assolutamente "di principio".
    Rileggendo la tua risposta mi viene una serie di dubbi...
    1) Quindi conviene dichiarare i vettori nel corpo delle funzioni così, andando nelo stack, l'esecuzione del codice sarà più veloce, giusto? Ma in questo caso il vettore "sparirebbe" appena termina la funzione che lo ha chiamato, vero?
    2) Se voglio evitare l'errore di stack overflow dovrei, però, sapere esattamente la dimensione di stack disponibile sulla mia macchina e la dimensione del vettore. C'è modo di saperli? (ho provato cat /proc/cpuinfo ma non mi è sembrato utile)
  • Re: [C] Dimensione massima di un vettore

    No, l'esecuzione del codice non sarà più veloce, perché mai dovrebbe esserlo?

    Le dimensioni dello stack usato dalla tua applicazione la puoi gestire tu tramite apposita opzione del compilatore (quale usi?).
  • Re: [C] Dimensione massima di un vettore

    Segnalerei anche questo sintetico intervento dell'utente migliorabile:
    https://www.iprogrammatori.it/forum-programmazione/cplusplus/crivello-eratostene-t25385.html#p8542859
  • Re: [C] Dimensione massima di un vettore

    oregon ha scritto:



    Le dimensioni dello stack usato dalla tua applicazione la puoi gestire tu tramite apposita opzione del compilatore (quale usi?).
    gcc
    Un'altra domanda: il vettore raggiunge la sua massima dimensione nel momento in cui lo inizializzo (riempiendolo di 0), vero? Quindi lo stack overflow dovrei averlo subito, prima ancora di inserirci dati.
  • Re: [C] Dimensione massima di un vettore

    vuott ha scritto:


    Segnalerei anche questo sintetico intervento dell'utente migliorabile:
    https://www.iprogrammatori.it/forum-programmazione/cplusplus/crivello-eratostene-t25385.html#p8542859
    Da questo intervento credo di aver capito che, banalmente, la dimensione di un vettore è data dal prodotto tra il numero di elementi che lo costituisce e la dimensione del singolo elemento (che a sua volta dipende dal tipo di dato contenuto).
    Grazie vuott
  • Re: [C] Dimensione massima di un vettore

    gcc
    Quindi puoi usare l'opzione

    --stack

    del compilatore. Fai una ricerca per chiarimenti.
    Un'altra domanda
    Non quando lo inizializzi ma quando lo dichiari con i valori massimi degli indici.
    a questo intervento credo di aver capito che, banalmente, la dimensione di un vettore è data dal prodotto tra il numero di elementi che lo costituisce e la dimensione del singolo elemento (che a sua volta dipende dal tipo di dato contenuto).
    Ovviamente sì.

    Se un elemento occupa 4 byte di memoria e tu ne vuoi usare 100000 allora occuperai 400000 byte di memoria.
  • Re: [C] Dimensione massima di un vettore

    oregon ha scritto:


    Quindi puoi usare l'opzione

    --stack

    del compilatore. Fai una ricerca per chiarimenti.
    Grazie per la dritta, adesso approfondisco
  • Re: [C] Dimensione massima di un vettore

    oregon ha scritto:


    No, l'esecuzione del codice non sarà più veloce, perché mai dovrebbe esserlo?
    Io ho acquisito quasi tutte le mie nozioni quasi trent'anni fa, e per inerzia non mi sono mai tenuto informato. All'epoca me lo dissero amici per me esperti, e la spiegazione è stata che una variabile globale salta le operazioni di preparazione dello stack e sopratutto la copia degli oggetti. E mi pare che anche sullo Stoustroup, assai più recente, si accenni qualcosa del genere. Ma se quello che era valido per un 386 e compilatori di allora oggi non lo fosse più, non ne sarei sorpreso.
  • Re: [C] Dimensione massima di un vettore

    Buongiorno a tutti, scusate la riapertura del thread. Cercavo informazioni relative alla domanda iniziale. Sto usando Turbo C ver.3 per dos su un pentium 2 con 64MB di ram.
    Vorrei fare una matrice con 8Mbit di dati. Dichiaro, quindi, una variabile globale tipo char x[1000000] dove potrò inserire un milione di valori a 8 bit?
  • Re: [C] Dimensione massima di un vettore

    Il tuo vettore occuperà 1 Mbyte ma il DOS non poteva gestirli, quindi avrai un errore
  • Re: [C] Dimensione massima di un vettore

    Infatti posso arrivare fino a 60k. Eventualmente come farei a gestire 1MB?
  • Re: [C] Dimensione massima di un vettore

    Il DOS e il Turbo C sono la preistoria.

    Usa Windows/Linux 32/64 bit e un compilatore moderno su un PC adeguato
Devi accedere o registrarti per scrivere nel forum
22 risposte