может ли компилятор оптимизировать управление памятью, выделяя статический массив в куче? - PullRequest
0 голосов
/ 27 июля 2011

Я хотел выделить большой массив символов в сегменте данных , поэтому я использовал такой код:

const int size = 1000000000 ;
static char chr [ size ] ;

int main ( ) 
{ 
    chr [ size - 1 ] = 1 ;  // line 1 
    string s ;
    cin >> s ;              // line 2
} 

строка 1: я поместил эту строку так, чтобы массивиспользуется по крайней мере один раз, и он не оптимизирован из компилятора

строка 2: чтобы остановить выполнение и проверить занятость памяти, например: в диспетчере задач Windows

наВ результате система Windows приводит к тому, что когда программа застревает в строке 2, ожидая ввода пользователя, в диспетчере задач (в обоих столбцах «Память» и «Рабочий набор») объем памяти, используемый процессом, значительно меньше ожидаемого 1 ГБ.

Затем я попытался использовать следующий код:

    int main ( ) 
    { 
        for ( int i = 0 ; i < size ; ++ i )
        {
            chr [ i ] = i ;
        }
        string s ;
        cin >> s ; // line 2
     } 

Теперь, когда программа достигает строки 2, использование памяти достигает ожидаемого 1 ГБ после нескольких секунд быстрого роста.

Кажется, что память распределяется динамически, а не статически.

Неправильно ли мое понимание массивов / модели памяти?

Распределяет ли компилятор большие объемы данных?ta динамически для оптимизации?

Показывает ли диспетчер задач физически выделенную память и поэтому 1 ГБ изначально выделяется на жестком диске до первого использования?

Ответы [ 4 ]

2 голосов
/ 27 июля 2011

Операционная система выделяет память только после того, как к ней обращались.Читайте о пейджинге по требованию.

0 голосов
/ 27 июля 2011

Поскольку вы на самом деле не используете массив (его удаление не повлияет на вывод вашей программы), компилятор может оптимизировать его. А некоторые системы используют форму отложенного выделения: они не выделяют(и взимайте плату за процесс) с отдельных страниц до тех пор, пока вы на самом деле не получите к ним доступ, даже без оптимизации вы дотрагиваетесь только до одной страницы.Но поскольку виноваты и Windows, и Linux, мы должны с этим смириться.)

0 голосов
/ 27 июля 2011

Вы выделяете виртуальную память.

Если вы на самом деле не используете его, его не нужно нигде хранить.

0 голосов
/ 27 июля 2011

Распределяет ли компилятор динамически большие объемы данных для оптимизации?
Нет, это не так!

Компилятор никогда не выполнит такую ​​оптимизацию.
Только явно динамически выделенная память будет идти в свободное хранилище (или кучу)

Когда вы делаете

const int size = 1000000000 ;
static char chr [ size ] ;

в глобальной области видимости, память, которая используется, даже не стековая память, память виспользуется сегмент данных или сегмент BSS, однако, стандарт C ++ не определяет, где он должен быть размещен, он оставлен как внутренняя реализация компиляторов, но он определенно не размещен в freestore (он же куча)

Кроме того, не используйте диспетчер задач для профилирования использования памяти вашими программами на C ++, в частности, используйте для этого инструменты профилирования. То, что диспетчер задач показывает вам, не является истинной программой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...