2010-04-09 7 views
7

Sono relativamente nuovo per C++, e fin dall'inizio che è stato perforato in me che non si può fare qualcosa di similePerché il C++ consente matrici di lunghezza variabile che non sono allocate dinamicamente?

int x; 
cin >> x; 
int array[x]; 

Invece, è necessario utilizzare la memoria dinamica. Tuttavia, ho scoperto di recente che il precedente sarà compilare (anche se ottengo un avvertimento -pedantic che dice che è vietato da ISO C++). So che è ovviamente una cattiva idea farlo se non è consentito dallo standard, ma in precedenza non sapevo nemmeno che fosse possibile.

La mia domanda è, perché g ++ consente array di lunghezza variabile che non sono allocati dinamicamente se non è consentito dallo standard? Inoltre, se è possibile per il compilatore farlo, perché lo non è nello standard?

+3

Per quanto riguarda la tua ultima domanda, perché C++ non li supporta, potresti anche consultare questa domanda: http://stackoverflow.com/questions/1887097/variable-length-arrays-in-c e comp.lang. thread C++ collegato nella risposta accettata. –

risposta

19

Il supporto per array di lunghezza variabile (VLA) è stato aggiunto al linguaggio C in C99.

È probabile che dal momento che il supporto per loro esiste in gcc (per supportare C99), è stato relativamente semplice aggiungere il supporto per loro a g ++.

Detto questo, è un'estensione di linguaggio specifica dell'implementazione e non è una buona idea utilizzare estensioni specifiche dell'implementazione se si desidera che il codice sia portatile.

+1

Non ero a conoscenza che era nello standard C. Questo spiega bene, grazie! – Maulrus

+2

@Maulrus: Tenete a mente che era nello standard C, questo è completamente separato dallo standard C++. –

5

Perché è supportato in C99. Non posso davvero parlare del perché non sia nello standard C++. Tuttavia, non è così utile come potresti pensare perché porta facilmente (se non stai attento) allo stack overflow (poiché è tipicamente basato su alloca, a sua volta non standard). Un altro errore consiste nel restituire un puntatore a un array dinamico, che andrà immediatamente fuori dal campo di applicazione.

+0

Quindi sarebbe meglio attenersi array per allocati dinamicamente in C99, anche se è nella norma? – Maulrus

+4

@Maulrus non utilizza mai VLA con dimensioni basate sull'input dell'utente. Tuttavia, lo stesso è vero per gli array allocati nell'heap. Devi convalidare l'input dell'utente in entrambi i modi. Quindi non vedo un problema specifico per VLA qui. Ecco la mia linea guida approssimativa: se il set di dati è piccolo, usa un piccolo array di dimensioni statiche e un int che dice quanti elementi sono usati. E se il set di dati è grande, usa l'heap. Tuttavia, non vedo un caso d'uso per VLA. –

+1

Probabilmente non era nello standard C++ del 1995 perché precedeva la standardizzazione C99 degli array a lunghezza variabile. Probabilmente non è nello standard imminente perché 'vector <>' offre funzionalità simili. –

3

I lotti di compilatori abbracciano ed estendono gli standard. Ci sono due ragioni fondamentali:

  1. Nefarious compilatore-scrittori probabilmente pensano che, per rendere più difficile per allontanarsi da loro compilatore aiuta ad aumentare la longevità.
  2. I benevoli scrittori di compilatori probabilmente pensano che offrirti più opzioni quando possono a poco o nessun costo per se stessi è una buona cosa.
1

Tutte le ragioni menzionate che hanno a che fare con loro in C sono corrette, anche se ci sono limitazioni per il requisito. Il tuo esempio potrebbe dimostrare un supporto più flessibile rispetto a quello richiesto in C (se lo hai implementato utilizzando scanf anziché cin, inseriscilo in un file .c e usalo gcc).

Questa è quasi solo una chiamata implicita a alloca (allocate auto) che riduce semplicemente il puntatore dello stack (aumentando la dimensione dello stack) e copia il nuovo puntatore dello stack su un altro registro che viene utilizzato come puntatore alla memoria allocata.

La differenza è che costruttori e distruttori non stanno per essere invitato oggetti creati con un alloca.

Problemi correlati