Форум программистов, компьютерный форум, киберфорум
Наши страницы

Выделение памяти - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Описать процедуру в С http://www.cyberforum.ru/cpp-beginners/thread256980.html
Описать процедуру AddRightDigit(D, K), добавляющую к целому положительному числу K справа цифру D (D — входной параметр целого типа, лежащий в диапазоне 0-9, K — параметр целого типа, являющийся...
C++ Visual Studio 2010 кто что думает Давайте обговорим 10ю студию. Мое мнение - она недоработаная, например, стоит что-то поменять в хэдере и она вылетает, интелисенс материться когда прога работает, при чем, какой-то он тупой... Кто... http://www.cyberforum.ru/cpp-beginners/thread256979.html
C++ Л/р "Использование строк"
Написать программу, которая считывает английский текст из файла и выводит его на экран, заменив каждую первую букву слов, начинающихся с гласной бук¬вы, на прописную. код #include "stdafx.h"...
C++ Время скидок
Помогите пожалуйста решить на си: Написать программу вычисления стоимости покупки с учетом скидки. Скидка в 10% предоставляется, если сумма покупки больше 1000 руб. Ниже приведен рекомендуемый вид...
C++ При построчном чтении файла eof наступает раньше срока http://www.cyberforum.ru/cpp-beginners/thread256967.html
Здравствуйте, товарищи! Столкнулся с такой проблемой: при построчном потоковом чтении файла (при помощи getline) бит eof устанавливается раньше, чем положено (считывается меньше половины...
C++ требала с екстерналами Всем не хворать! Пишу класс, чтото типа стринг. хедер: #pragma once class Cue { int size, step, curInd; char* Str; void newMem(); void terminate(); подробнее

Показать сообщение отдельно
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.03.2011, 18:43
Jugger, для начала каждый экземпляр вашего класса занимает 8 байт, 8 * 10 = 80. Вот, посмотрите сами, если не верите:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
 
using namespace std;
 
class element
{
public:
  int x;
  element* next;
 
  element(int q)
  {
     x = q;
     next = 0;
  };
 
  ~element();
};
 
element *perv = 0, *posl = 0;
int size = 0 ;
 
void addtolist(int x)
{
     element * t = posl;
 
     posl = new element( x );
 
     if ( perv == 0 )
         perv = posl;
     else
         t->next = posl;
 
    size++;
};
 
int main( int argc, char ** argv )
{
    for( int i = 0; i < 10; i++ )
       addtolist( i + 1 );
 
    cout << "\n==== (" << size << ") ====\n";
 
    for( element *t = perv; t != 0; t = t->next )
       cout << t->x << "; ";
 
    cout << "\n\nsizeof(element) = " << sizeof( element ) << endl
         << "sizeof(element) * " << size << " = " << sizeof( element ) * size << endl
         << "posl - perv = " << int(posl) - int(perv) << endl
         << "\n*perv = " << perv << endl
         << "*posl = " << posl << endl;
 
    return 0;
}
Но суть не в этом. При динамическом выделении памяти свободные куски памяти выделяются из кучи (heap). Смысл в том, что куча - это огроменный кусок свободной памяти, из которого каждому приложению по запросу выделяется какой-то участок. Политика выбора участков может быть разная, зависит от ОС, но смысл в том, что не обязательно память под ваш список выделится вам последовательно. Смотрите, вот схема памяти. Пусть зелёным будет ваше приложение, красным и фиолетовым - два других:

00 08 A4 F2 76 BC 1A 00 00 18 C4 4C 00 00 00 01 00 22 FF 77 74 68 2F 41 86 96 30 14 25 88 FA C2 00 D2 33 14 EA E5 E8 A0 00 08 A4 F2 76 BC 1A 00 00 18 C4 4C 00 00 00 01 00 22 FF 77 74 68 2F 41 86 96 30 14 25 88 FA C2 00 D2 33 14 EA E5 E8 A0 00 08 A4 F2 76 BC 1A 00 00 18 C4 4C 00 00 00 01 00 22 FF 77 74 68 2F 41 86 96 30 14 25 88 FA C2 00 D2 33 14 EA E5 E8 A0

То есть куски памяти выделяются по запросу. Грубо говоря, ищется свободный кусок нужного размера и отдаётся вам. Через секунду avp.exe запросил 8 байт, нашли кусок, отдали ему, потом 256 байт запросил taskmgr.exe, отдали ему, потом опять вы 8 байт. Вам отдали ваши 8 байт, но никто не гарантирует, что они будут лежать сразу после куска, который был отдан вам в предыдущий запрос. По-этому между двумя соседними элементами списка расстояние может быть хоть в гигабайт - физически они не рядом. Только благодаря указателю на следующий элемент списка вы можете сказать, в каком участке ваших четырёх гигов оперативки и восьми гигов свопа лежит следующий элемент списка.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.