2017-01-30 1 views
1

Я использую Microsoft Visual Studio 2008Где C++ создает стек и кучу в памяти?

Когда я создаю указатель на объект, он получит адрес памяти, который в моем случае является шестнадцатеричным шестнадцатеричным числом. Например: 0x02e97fc0

С 8 шестнадцатеричными цифрами компьютер может адресовать 4 ГБ памяти. У меня есть 8 ГБ оперативной памяти в моем компьютере:

  1. Означает ли это, что мой IDE не используется более 4GBs из моей памяти?

  2. Является ли IDE способным адресовать только первые 4 ГБ моей памяти или любые 4 ГБ из 8 ГБ, которые не используются?

Вопрос касается не только размера используемой памяти. Это также касается местоположения используемой памяти. Последнее не было описано здесь: The maximum amount of memory any single process on Windows can address

+0

ведущих 0-х часто отбрасывается, поскольку они не меняют значения. – NathanOliver

+1

Компиляция для 64-битной цели также предоставит вам 64-битные указатели, позволяющие обращаться к большему объему памяти. – Steeve

+0

Возможный дубликат [Максимальный объем памяти любого отдельного процесса в Windows может быть адресован] (http://stackoverflow.com/questions/11891593/the-maximum-amount-of-memory-any-single-process-on-windows -can-address) –

ответ

4

Где C++ создает стек и кучу в памяти?

Ну, C++ не справляется с памятью, она просит операционную систему сделать это. Когда вы загружаете двоичный объект (.exe, .dll, .so ...) в память, это ОС, которая выделяет память для стека. Когда вы динамически выделяете память с помощью new, вы запрашиваете ОС для некоторого места в куче.

1) Означает ли это, что моя IDE не использует больше 4 ГБ из моей памяти?

Нет, не совсем. Фактически, современные ОС, такие как Windows, используют так называемое virtual address space. Он отображает, по-видимому, непрерывный сегмент памяти (скажем 0x1000 до 0xffff) в сегмент виртуальный пространство только для вашей программы; у вас нет абсолютно никакой гарантии, где ваши объекты действительно лежат в памяти. Когда адрес разыменовывается, ОС делает некоторую магию и позволяет вашей программе обращаться к физическому адресу в памяти.

Diagram of relationship between the virtual and physical address spaces.

Имея 32 бита адреса означает один экземпляр вашей программы не может использовать более, что 4 Гб оперативной памяти. Два экземпляра вашей же программы могут, так как ОС может выделять два разных сегмента физического адреса внутри видимого сегмента виртуального адреса (0x00000000 до 0xffffffff). И Windows будет выделять еще более перекрывающиеся адресные пространства для своих собственных процессов.

2) Является ли IDE способным адресовать только первые 4 ГБ моей памяти или любые 4 ГБ из 8 ГБ, которые не используются?

Любые. Даже несмежная память, даже дисковая память ... никто не может сказать.

Найдено некоторый источник Microsoft в комментариях по этому поводу: https://msdn.microsoft.com/en-us/library/aa366778.aspx

+0

Означает ли это, что когда я получаю адрес объекта, я получаю только виртуальный адрес, а не физический адрес? (В противном случае я мог бы сломать части других программ.) – Attis

+0

Да, вы имеете дело только с виртуальными адресами. Это не только защищает процессы друг от друга, но и позволяет операционной системе обрабатывать физическую память более эффективно. – YSC

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