2016-10-22 1 views
0

Привет, я видел это Maximum size of local array variable, но я хочу знать, почему это нормально, если массив задан как глобальный, а не нормально, если он приходит после основного.переменная локального массива exc плохой сегмент и локальный или глобальный сегмент?

И еще один вопрос в отношении: Хорошая практика иметь большие объекты памяти, которые определены в a.cpp и объявлены в a.hpp с помощью extern? Или лучше работать с большой памятью, определенной в локальной фильтрации, но определяемой как векторный или новый или malloc и передавая их в аргументах fonction.

Это видеть мой опыт, это те вопросы, которые я должен решить ...

Спасибо

#include <iostream> 
using namespace std; 

#define N (10000000000000) 
int sd[N]; 

int main() { 
    // int sd[N]; 
    return 0; 
} 
+0

Если у вас есть очень большие или неизвестные массивы размера, вы хотите использовать кучу. – amanuel2

+2

Используйте вместо этого 'std: vector '. –

+0

Ваши локальные переменные для подпрограммы выделяются в стеке, что, как ожидается, будет относительно небольшим. Глобальные переменные (упрощение) распределяются по куче, что по умолчанию намного больше. Ваши переменные также могут быть распределены с помощью кучи в локальной процедуре с помощью new() или malloc(), но указатель, используемый для ссылки на эти переменные, может выйти из области действия, когда функция завершается, что вызывает утечку памяти, если только вы сначала выделите память, используя delete() или free(). – mikeTronix

ответ

0

Заявленный в глобальном масштабе:

int sd[N]; 

int main() { 
    return 0; 
} 

И в результате двоичный просто получает реальный большой. Когда процесс загружаются в память, весь набор глобальных данных памяти отображаются в

объявленный внутри функции:

int main() { 
    int sd[N]; 
    return 0; 
} 

И память выделяются как только функция, как вызывается - и это. выделено из стека. Стек стека для потока обычно инициализируется низким, ближе к мегабайту или меньше. Как только память стека заканчивается, игра заканчивается.

Как отмечают другие в комментариях, правильный способ выделения массива LARGE осуществляется динамически, используя память кучи, которая обычно является обильной.

int main() { 
    int* sd = new int[N]; 

    ... 

    delete [] sd; // free the allocated memory 
    return 0; 
} 

Еще лучше, так что вы не должны помнить об удалении:

int main() { 
    std::vector<int> sd(N); 

    ... 

} 
+0

http://stackoverflow.com/questions/40202324/c-vector-appear -to-be-faster-than-c-array-time-why – user7058377

+0

Почему вектор быстрее, чем c-массив? – user7058377

+0

@ user7058377: Контейнер не медленный или быстрый. Индивидуальные операции выполняются медленно или быстро. И вы только заботитесь о скорости, когда и **, если ** вы на самом деле * испытали *, что что-то слишком медленно. До тех пор вы используете правильный инструмент. 'std :: vector ', безусловно, является правильным инструментом здесь. –

Смежные вопросы