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

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

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

Показать сообщение отдельно
talis
791 / 543 / 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 байт, но никто не гарантирует, что они будут лежать сразу после куска, который был отдан вам в предыдущий запрос. По-этому между двумя соседними элементами списка расстояние может быть хоть в гигабайт - физически они не рядом. Только благодаря указателю на следующий элемент списка вы можете сказать, в каком участке ваших четырёх гигов оперативки и восьми гигов свопа лежит следующий элемент списка.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru