2016-02-01 12 views
7

Kiedy uruchomić ten kod w moim Devcpp compiler->Różnica między tablicą a wektorem związana z maksymalnym rozmiarem?

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

To działa nawet w czasie wykonywania. Ale kiedy Run->

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

Daje mi błąd łącza.

Dopóki wymagane jest miejsce, zarówno arr, jak i vec wymagają tego samego miejsca. Dlaczego więc kod vec działa nawet dobrze w czasie wykonywania, ale kod arr nie kompiluje się nawet.

+0

@dvenkatsagar nie, to nie ma sensu. –

+0

@dvenkatsagar To nie ma sensu. – erip

+0

@ MarcusMüller Jinx. Jesteś mi winien wodę. :) – erip

Odpowiedz

9

Problem dotyczy alokacji. W pierwszym przypadku std::vector domyślnie używa alokacji dynamicznej, która w zasadzie może przydzielić tyle pamięci, ile chcesz (ograniczona oczywiście przez system operacyjny i ilość pamięci fizycznej), podczas gdy w drugim przypadku używa pamięci dostępnej do alokacji statycznej (Pod względem technicznym macie: static storage duration), która w twoim przypadku jest mniejsza niż 1000000000 * sizeof int bajtów. Zobacz this, aby uzyskać ładną odpowiedź dotyczącą różnych typów przydziałów w programie C (dotyczy to również C++).

Btw, unikaj #include<bits/stdc++.h>, ponieważ jest niestandardowy. Uwzględnij tylko wymagane nagłówki . Jeszcze jeden problem: nie wydaje mi się, aby wystąpił błąd podczas kompilacji, prawdopodobnie pojawia się błąd czasu wykonywania. Innymi słowy, kod kompiluje się dobrze, ale nie działa.

+0

To jednak nie wyjaśniałoby błędu kompilacji. –

+0

@StevenBurnap Nie jestem pewien, czy OP otrzymuje błąd kompilacji, jest to prawdopodobnie błąd czasu wykonania. Dokona edycji odpowiedzi. – vsoftco

+0

Tak, to, co mówisz, ma sens, jeśli OP ma błąd runtime. –

3

Wydaje się, że obiekt

int arr[1000000000]; 

jest zbyt duża, aby zmieścić się w globalnych danych programu dla danego środowiska. Nie otrzymuję błędu czasu kompilacji, ale dostaję również błąd czasu łącza w moim środowisku (cygwin/g ++ 4.9.3).

Zmniejszenie rozmiaru o jedną dziesiątą pracy dla mnie. To może działać również dla ciebie. Nie wiem, jak określić maksymalny rozmiar obiektów, które mogą zmieścić się w danych globalnych.

Powierzchnia dostępna w stosie jest najmniejsza.
Dostępna przestrzeń w danych globalnych jest większa od tej.
Dostępne miejsce w sterty jest największym ze wszystkich.

Jeśli obiekt jest za duży, aby zmieścić się w stosie, spróbuj umieścić go w danych globalnych.
Jeśli obiekt jest zbyt duży, aby zmieścił się w danych globalnych, użyj sterty.

+0

'int arr [1000000000];' jest obiektem? naprawdę? – StahlRat

+1

@StahlRat, W modelu obiektowym C++ każda zmienna jest obiektem. –

+1

Załącznik B nazw standardowych C++ 262144 jako wytyczna dla maksymalnego rozmiaru obiektu. Jeśli rozumiem poprawnie, oznacza to, że w przypadku niedynamicznej tablicy 'int', wszystko aż do' 262144/sizeof (int) 'elementów powinno być w porządku z implementacją jakości. Ale oczywiście, * "te ilości są jedynie wytycznymi i nie określają zgodności" *. –

Powiązane problemy