Форум программистов, компьютерный форум CyberForum.ru

Что почитать про распределение памяти? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Kаwaii
2 / 2 / 0
Регистрация: 23.08.2010
Сообщений: 8
23.08.2010, 10:49     Что почитать про распределение памяти? #1
Привет, самостоятельно изучаю С++, пару книг прочла, отложилось немного полезного в моей голове, но вот возникли ряд вопросов. Скажем, когда создается переменная, она сохраняется в стеке - а где этот стек находится, как все это физически взаимодействует (и почему, скажем, мы в стеке не можем хранить объекты, или вот еще - можем ли мы объекты создавать где угодно в любом месте памяти а не только в куче). А еще про кучу - она где физически находится. Виртуальный диструктор - как он из таблицы виртуальных функций определяет свой базовый класс (и где эта виртуальная таблица собственно находится сама), а еще что происходит при компиляции - хочу знать все самым подробным образом, а не так как в книгах по С++ написано на пару страницах во вступлении. У меня огромное количество подобных вопросов, но я понимаю что сколько бы не задавала по одному здесь на форуме, ясной картинки у меня не будет. Мне просто необходимо прочтение дополнительной литературы прежде чем я опять продолжу изучать С++. Потому как согласитесь создавать объекты и даже не не иметь досконального представления о том, как он на самом деле создается - это даже стыдно.
Подскажите мне книги, из которых можно было бы подчерпнуть недостающие знания.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2010, 10:49     Что почитать про распределение памяти?
Посмотрите здесь:

C++ Распределение памяти
C++ распределение памяти
Распределение памяти C++
Где можно почитать про списки на C/C++? C++
C++ Где можно почитать про списки на C++?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
23.08.2010, 11:41     Что почитать про распределение памяти? #2
Ну короче.
При создании программы ей выделяется 4 гига памяти...
НЕт, не то.

Тебе нужно взять какую-нибдь простую программ, hello word, например, запихать её в отладчик и ты всё увидишь своими глазами. Лучше 1 раз увидеть чем 7 раз услышать

Увидишь стек, который просто участок памяти и прочая блин короче, заходи ко мне в личку дам ссыль на исследование программ. Там скачаешь отладчик, там всё чисто и честно расписано на русском языке.

Добавлено через 1 минуту
можешь даже меня спрашивать лично только чур вопросы ОЧЕНЬ КОНКРЕТНЫЕ И ПРЕДМЕТНЫЕ
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
23.08.2010, 11:44     Что почитать про распределение памяти? #3
Kаwaii, понимаете ли, есть стандарт языка, который описывает этакую виртуальную машину С++. Так вот, стандарт не оговаривает явно как должна быть устроена куча, стек и т.д. и т.п. Все это отдано на откуп разработчикам компиляторов, а посему ответы будут зависеть от реализации языка. Читайте стандарт.
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
23.08.2010, 12:16     Что почитать про распределение памяти? #4
Тут не только разработчики компиляторов - свои ограничения еще накладывает операционная система.

Что касается знать все и сразу досконально - это вряд ли получится.
Нужно постепенно углубляться в предмет изучения.

Вопросы можно просто записывать, чтобы потом проверить появился ли ответ на вопрос или еще нет

Скажем, когда создается переменная, она сохраняется в стеке
Не совсем так - например глобальная переменная не сохраняется в стеке.

почему, скажем, мы в стеке не можем хранить объекты
Можем хранить.
Но стек не резиновый - объект может быть большой и просто не влезет в стек.
Поэтому C++ рекомендует объект хранить в куче, а в стеке получается что будет храниться переменная - указатель на объект.
Стек имеет ограниченный размер - например 16Mb.

можем ли мы объекты создавать где угодно в любом месте памяти а не только в куче
Теоретически да.
Но практически распределение памяти скорее всего такое, что свободная доступная приложения память находится только в куче.
При этом если в куче мало места, то программа попросит ОС расширить ей область памяти занятую под кучу. Но это расширение тоже не бесконечно. Под Windows скорее всего получиться выделить не более 2Gb памяти в 32-битном режиме.
Kаwaii
2 / 2 / 0
Регистрация: 23.08.2010
Сообщений: 8
24.08.2010, 10:37  [ТС]     Что почитать про распределение памяти? #5
Спасибо парни, я стала немного понимать, сейчас пойду попрошу у kravam ссылку на исследование программ, поизучаю детально.
Kаwaii
2 / 2 / 0
Регистрация: 23.08.2010
Сообщений: 8
25.08.2010, 11:35  [ТС]     Что почитать про распределение памяти? #6
А вот возник еще вопрос. Вот, к примеру самый простой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <windows.h>
#include "stdafx.h"
 
 
int _tmain(int argc, _TCHAR* argv[])
{
   int x=0;
   int y=10;
   int z=5;
   for (x; x < y; x++)
 
   {
     std::cout << z << std::endl;
 
   }
 
 Sleep(2500);
    return 0;
}
Я правильно понимаю следующее: здесь три не глобальных переменных типа int по 32 бита каждый. Это значит что компилятор в стеке отводит сперва для x 32 бита, потом рядом для y 32 бита и наконец для z 32 бита. Получается, что наверху стека будет z , а внизу x (ну, не в самом низу, под x наверняка будут еще какие либо переменные или объекты, используемые в других программах и инициализированные раньше). Так вот, когда нужно пробежаться по for (x; x < y; x++) компилятор что будет делать? чтоб добраться до x, он начнет перебирать все что сверху до него уже "наложено"? А потом ему потребуется y, и что, он опять начнет сначала методом перебора в стеке y выискивать пока до него не дойдет? Объясните кто знает
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
25.08.2010, 15:16     Что почитать про распределение памяти? #7
Тут всё не так просто.
Во-первых: измени свой код. Оставь самое необходимое. В главной функции ты объявляешь переменные, изменяешь одну из них в цикле... Так оставь ТОЛЬКО эти составляющие.

C++
1
2
3
4
5
6
7
8
9
int main() {
   int x=0;
   int y=10;
   int z=5;
   for (x; x < y; x++)   {
    z= 1;
   }
 return 0; 
}

Во-вторых. Запомни: каждый компилятор работает по своему. То есть каждый сделает то, что ты задумала. Но они соревнуются друг с другом в запутаности, что ли. Так, например, при компиляции Этого кода мне с большим трудом удалось отыскать участо кода, выполняющийся ДАЛЕКО не сразу. Но именно он непосредственно и выполнял задуманное. Вот этот участок

C++
1
2
3
4
5
6
7
8
9
10
11
MOV DWORD PTR SS:[EBP-4],0
MOV DWORD PTR SS:[EBP-8],0A
MOV DWORD PTR SS:[EBP-C],5
MOV EAX,DWORD PTR SS:[EBP-4]
CMP EAX,DWORD PTR SS:[EBP-8]
JGE SHORT ra.004012E5
MOV DWORD PTR SS:[EBP-C],1
LEA EAX,DWORD PTR SS:[EBP-4]
INC DWORD PTR DS:[EAX]
JMP SHORT ra.004012CF
MOV EAX,0
Обратите внимание, девушка, в стек кладётся то, что вы хотели 0, 10 (в шестнадцатиричной системе A и 5) А обращение к этим переменныи идёт так: Ну вот чтобы обратиться к той переменной, которая 5, пишется так:
C++
1
MOV EAX,DWORD PTR SS:[EBP-4]
Ну, вот.Что это за команды, что это за парметры ВЫ просто обязаны изучить по ссылке, что я ВАм дал или по учебнику для ассемблера.
Kаwaii
2 / 2 / 0
Регистрация: 23.08.2010
Сообщений: 8
25.08.2010, 15:57  [ТС]     Что почитать про распределение памяти? #8
Цитата Сообщение от kravam Посмотреть сообщение
Обратите внимание, девушка, в стек кладётся то, что вы хотели 0, 10 (в шестнадцатиричной системе A и 5) А обращение к этим переменныи идёт так: Ну вот чтобы обратиться к той переменной, которая 5, пишется так:
C++
1
MOV EAX,DWORD PTR SS:[EBP-4]
Ну, вот.Что это за команды, что это за парметры ВЫ просто обязаны изучить по ссылке, что я ВАм дал или по учебнику для ассемблера.
Да да, я там читаю, дошла до третьей главы. Эта команда означает:поместить значение с размером DWORD (32-бита) из памяти со смещением EBP-4 в регистр EAX.
Тут я нашла книжку (Windows для профессионалов, Джеффри Рихтер), там есть раздел про управление памяти, но я пока до него не дошла, я только еще про процессы читаю и потоки. Я начала читать, так даже половины не понимаю. Так вот я о чем думаю - может мне сперва эту книгу прочитать, а потом оставшиеся главы про ассемблер дочитывать?
easybudda
25.08.2010, 20:17
  #9

Не по теме:

Цитата Сообщение от Kаwaii Посмотреть сообщение
Я начала читать, так даже половины не понимаю.
Вы не поверите, но это нормально. Прочитав один раз, подобную литературу действительно тяжело осмыслить (не Данцова всё-таки)... Я обычно таким путём иду - первый раз читаю всё подряд особо не вникая, но какие-то ключевые моменты всё-таки в голове откладываются. Со второго раза чтение уже более осмысленно. Ну а потом главы, нужные для решения какой-то конкретной задачи, уже значительно меньше вопросов вызывают - разве, что какие-то детали в справочнике уточнить нужно...

Kаwaii
2 / 2 / 0
Регистрация: 23.08.2010
Сообщений: 8
25.08.2010, 20:37  [ТС]     Что почитать про распределение памяти? #10
Цитата Сообщение от easybudda Посмотреть сообщение

Не по теме:


Вы не поверите, но это нормально. Прочитав один раз, подобную литературу действительно тяжело осмыслить (не Данцова всё-таки)... Я обычно таким путём иду - первый раз читаю всё подряд особо не вникая, но какие-то ключевые моменты всё-таки в голове откладываются. Со второго раза чтение уже более осмысленно. Ну а потом главы, нужные для решения какой-то конкретной задачи, уже значительно меньше вопросов вызывают - разве, что какие-то детали в справочнике уточнить нужно...

Спасиб, прям подбодрили. Тогда сперва Рихтера дочитаю, потом про ассемблер продолжу главы дочитывать
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
26.08.2010, 09:33     Что почитать про распределение памяти? #11
Цитата Сообщение от Kаwaii Посмотреть сообщение
Да да, я там читаю, дошла до третьей главы. Эта команда означает:поместить значение с размером DWORD (32-бита) из памяти со смещением EBP-4 в регистр EAX.
Да, так. Только уточнение.
В этом коде EBP указывало на память, но не абы какую, а именно на СТЕК.
В общем, отладчик это наше всё.
Andrey_hello
1 / 1 / 0
Регистрация: 15.01.2014
Сообщений: 15
15.01.2014, 21:22     Что почитать про распределение памяти? #12
Цитата Сообщение от kravam Посмотреть сообщение
Ну, вот.Что это за команды, что это за парметры ВЫ просто обязаны изучить по ссылке, что я ВАм дал или по учебнику для ассемблера.
kravam,

Здравствуйте! А можно мне тоже вашу ссылку? По программированию я далеко не новичок, но как-то обходился без влезания вглубь, даже без знания алгоритмов особо. Сейчас начал активно доучиваться, чтобы двигаться по-жизни дальше. На полноценное изучение ассемблера нет времени - надо именно применительно к кодированию на С++ и всяким Visual-студиям. С принципами ассемблера знаком - в своё время на дипломе представил работающий макет на AVR-контроллере (правда я учился не на программиста).

Набрал в поисковике "где физически находится стек" и попал сюда.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
16.01.2014, 00:35     Что почитать про распределение памяти? #13
Цитата Сообщение от Andrey_hello Посмотреть сообщение
Здравствуйте! А можно мне тоже вашу ссылку?
Я имел ввиду сайт wasm.ru, но он больше года назад приказал долго жить. Форум еле восстановили, а всё остальное (статьи) не могут. Обещали 14 января восстановить, теперь на 4 апреля перенесли. Но у меня есть локальная версия сайта, я сразу же после краха поднял тревогу и кто-то предусмотрительный мне её дал. Так что если надо- пиши в личку, дам локальную версию сайта.

Стек же физически находится в памяти, как ты сам понимаешь, ибо находиться ему больше просто негде. Тут на картинке это хорошо видно. Это как бы карта памяти загруженной программы. Видно по каким адресам где что находится, какие библиотеки загружены, да и сам файл (CRACKME). Стек главного потока, как видишь, расположен по адресу 12d000h и имеет размер 3000 байт. Примерно так.
Миниатюры
Что почитать про распределение памяти?  
Andrey_hello
1 / 1 / 0
Регистрация: 15.01.2014
Сообщений: 15
16.01.2014, 00:46     Что почитать про распределение памяти? #14
Форум меня пока не пускает писать в личку.
Про физическое размещение неправильно написал, поищу "в каком месте выделяется память под стек потока" - как я понимаю стек относится к потоку.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
16.01.2014, 00:51     Что почитать про распределение памяти? #15
Цитата Сообщение от Kаwaii Посмотреть сообщение
Это значит что компилятор в стеке отводит сперва для x 32 бита, потом рядом для y 32 бита и наконец для z 32 бита. Получается, что наверху стека будет z , а внизу x
не факт он может их и регистры затолкать
но чаще всего так и есть,
у компиляторов есть еще и оптимизаторы которые могут вообще заменить переменные на константы
Цитата Сообщение от Kаwaii Посмотреть сообщение
Так вот, когда нужно пробежаться по for (x; x < y; x++) компилятор что будет делать? чтоб добраться до x, он начнет перебирать все что сверху до него уже "наложено"?
нет
он будет изменять(увеличивать) переменную x до тех пор пока она не станет равна y
здесь придется работать с указателями и начинать надо с самой последней
стек растет сверху вниз у самой последней пременой самый малый адрес память
цикл может выглядеть так
C++
1
for(int* ptr=&z;ptr<=&x;ptr++)
рекомендую из литературы Криса Касперски
особенно его
"Фундаментальные основы хакерства" и "Техника отладки программ без исходных кодов"
из программ
дизасемблер IDA (есть бесплатные версии) отладчик OllyDebuger(Олька)
WinHex для просмотра шеснадцетеричных дампов
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
16.01.2014, 01:01     Что почитать про распределение памяти? #16
Цитата Сообщение от Andrey_hello Посмотреть сообщение
в каком месте выделяется память под стек потока
Почитай посты выше (не мои), там сказано, что это нигде не регламентировано. Ну то есть ясно, что под стек память не выделится по тем адресам, где должны быть библиотеки. Это типа стандарт, но опять же ТИПА. Точно я не знаю.

Наверное, мало кто знает это. Джефри Рихтер может знать. Но вообще принципиально это не особо важно. Ибо где бы поток не помещался, мне видится, что указатель на его вершину помещается в регистр ESP, и от него программа пляшет. То есть в программе, допустим такие инструкции, работающие со стеком:
Assembler
1
2
mov [esp+4], EAX
mov [esp+8], EBX
И где бы стек не находился, эти инструкции (суть программа) неизменны. Поэтому расположение стека особо ни на что не влияет, в пределах разумного, конечно. Если чё, пиши здесь, я сюда тебе дам ссыль.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2014, 16:28     Что почитать про распределение памяти?
Еще ссылки по теме:

Где почитать про работу сcom портами C++
C++ Подскажите пожалуйста где можно почитать про структуры
C++ Где почитать про перегрузку поразрядных логических операций (|, &, ^)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
16.01.2014, 16:28     Что почитать про распределение памяти? #17
тут еще нужно отметить что слово "стек" в Си используется в двух понятиях
1 Стек как организация данных "Последний пришел-первый ушел"
2 стек место где лежат локальные переменные, называется так видимо из за того что данные лежат в области памяти выделенной процессором под стек программы и обращение к ним идет из регистра ESI(80x86)
оба эти понятия ничего общего друг с другом не имеют
и может правильно называть не "стековые переменные" а "автоматические переменные " которые лежат в "автоматической памяти"
По крайней мере я такие термины встречал в переводной литературе
Yandex
Объявления
16.01.2014, 16:28     Что почитать про распределение памяти?
Ответ Создать тему
Опции темы

Текущее время: 07:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru