2016-02-01 11 views
7

Quando ho eseguito questo codice nel mio Devcpp compiler->Differenza tra una matrice e un vettore correlato alla dimensione massima?

#include<bits/stdc++.h> 
using namespace std; 
int main() 
{ 
    vector<int> vec; 
    for(int i=0;i<100000000;i++) 
    vec.push_back(i); 
} 

Funziona anche sulla fase di esecuzione. Ma quando Esegui->

#include<bits/stdc++.h> 
using namespace std; 
int arr[1000000000]; 
int main() 
{ 
    return 0; 
} 

Mi dà errore di collegamento.

Fintantoché lo spazio è necessario, sia arr che vec richiedono lo stesso spazio. Quindi perché il codice vec funziona anche bene in fase di esecuzione, ma il codice arr non viene nemmeno compilato.

+0

@dvenkatsagar no, non ha senso. –

+0

@dvenkatsagar Questo non ha senso. – erip

+0

@ MarcusMüller Jinx. Mi devi una bibita. :) – erip

risposta

9

Il problema è con l'assegnazione. Nel primo caso, std::vector predefinito allocator utilizza l'allocazione dinamica, che in linea di principio può allocare la quantità di memoria che si desidera (limitata naturalmente dal sistema operativo e la quantità di memoria fisica) mentre nel secondo caso utilizza la memoria disponibile per l'allocazione statica (tecnicamente la matrice ha static storage duration), che nel tuo caso è inferiore a 1000000000 * sizeof int byte. Vedi this per una buona risposta riguardo ai vari tipi di allocazioni in un programma C (che si applica anche a C++).

Btw, evitare #include<bits/stdc++.h>, poiché non è standard. Includere solo le intestazioni standard necessarie. Un altro problema: non penso che tu abbia un errore in fase di compilazione, probabilmente ottieni un errore in fase di esecuzione. In altre parole, il codice viene compilato correttamente ma non riesce a essere eseguito.

+0

Ciò non spiegherebbe comunque un errore di compilazione. –

+0

@StevenBurnap Non sono sicuro che OP stia ricevendo un errore di compilazione, probabilmente è un errore di run time. Modifica la risposta. – vsoftco

+0

Sì, quello che dici ha perfettamente senso se l'OP ha un errore di runtime. –

3

Sembra che l'oggetto

int arr[1000000000]; 

è troppo grande per entrare nei dati globali del programma per l'ambiente. Non ricevo un errore in fase di compilazione, ma ricevo anche un errore nel tempo di collegamento nel mio ambiente (cygwin/g ++ 4.9.3).

Ridurre le dimensioni di un decimo lavoro per me. Potrebbe funzionare anche per te. Non so come sia possibile determinare la dimensione massima degli oggetti che possono essere contenuti nei dati globali.

Lo spazio disponibile nello stack è il più piccolo.
Lo spazio disponibile nei dati globali è maggiore di quello.
Lo spazio disponibile nell'heap è il più grande di tutti.

Se l'oggetto è troppo grande per essere contenuto nello stack, provare a inserire dati globali.
Se l'oggetto è troppo grande per adattarsi ai dati globali, utilizzare heap.

+0

'int arr [1000000000];' è un oggetto? veramente? – StahlRat

+1

@StahlRat, Nel modello di oggetti C++, ogni variabile è un oggetto. –

+1

Allegato B dei nomi standard C++ 262144 come linea guida per la dimensione massima dell'oggetto. Se capisco correttamente, questo significa che per un array 'int' non dinamico, qualsiasi cosa fino a' 262144/sizeof (int) 'elementi dovrebbe andare bene con un'implementazione di qualità. Ma naturalmente, * "queste quantità sono solo linee guida e non determinano la conformità" *. –