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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
Lers
13 / 13 / 3
Регистрация: 27.05.2012
Сообщений: 203
#1

Как происходит процесс выделения памяти в стеке и куче - C++

16.01.2014, 14:46. Просмотров 2266. Ответов 48
Метки нет (Все метки)

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include "disc.h"
void main()
{
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  
  Disc d1,d2[2];
  Disc *d3,*d4;
  d3=new Disc;
  int kol=0,n;
  clrscr();
  kol++;
  printf("%i)",kol);
  printf("\nВведите название дисциплины -> ");
  gets(d1.namedisc);
  printf("Введите имя перподавателя -> ");
  gets(d1.teacher_name);
  printf("Введите название группы -> ");
  gets(d1.name_group);
  printf("Введите кол-во часов на изуч. дисциплины-> ");
  scanf("%i",&d1.hours);
  fflush(stdin);
  
  for (int i=0; i<1; i++)
  {
    clrscr();
    kol++;
    printf("%i)",kol);
    printf("\nВведите название дисциплины -> ");
    gets(d2[i].namedisc);
    printf("Введите имя перподавателя -> ");
    gets(d2[i].teacher_name);
    printf("Введите название группы -> ");
    gets(d2[i].name_group);
    printf("Введите кол-во часов на изуч. дисциплины-> ");
    scanf("%i",&d2[i].hours);
    fflush(stdin);
  }
 
  clrscr();
  kol++;
  printf("%i)",kol);
  printf("\nВведите название дисциплины -> ");
  gets(d3->namedisc);
  printf("Введите имя перподавателя -> ");
  gets(d3->teacher_name);
  printf("Введите название группы -> ");
  gets(d3->name_group);
  printf("Введите кол-во часов на изуч. дисциплины-> ");
  scanf("%i",&d3->hours);
  fflush(stdin);
 
  printf ("\n Введите кол-во записей-> ");
  scanf ("%i",&n);
  d4=new Disc [n];
  fflush(stdin);
  for (int i=0; i<n; i++)
  {
    clrscr();
    kol++;
    printf("%i)",kol);
    printf("\nВведите название дисциплины -> ");
    gets(d4[i].namedisc);
    printf("Введите имя перподавателя -> ");
    gets(d4[i].teacher_name);
    printf("Введите название группы -> ");
    gets(d4[i].name_group);
    printf("Введите кол-во часов на изуч. дисциплины-> ");
    scanf("%i",&d4[i].hours);
    fflush(stdin);
  }
  clrscr();
  kol=0;
  printf("\n------------------------------------------------------------");
  printf("\n|№|Название дисциплины |Имя преподавателя   |Имя группы|Час|");
  printf("\n------------------------------------------------------------");
  kol++;
  printf("\n|%1i|%20s|%20s|%10s|%3i|",kol,d1.namedisc,d1.teacher_name,d1.name_group,d1.hours);
  for (int i=0; i<1; i++)
    printf("\n|%1i|%20s|%20s|%10s|%3i|",kol+i+1,d2[i].namedisc,d2[i].teacher_name,d2[i].name_group,d2[i].hours);
  kol+=3;
   printf("\n|%1i|%20s|%20s|%10s|%3i|",kol,d3->namedisc,d3->teacher_name,d3->name_group,d3->hours);
  for (int i=0; i<n; i++)
    printf("\n|%1i|%20s|%20s|%10s|%3i|",kol+i+1,d4[i].namedisc,d4[i].teacher_name,d4[i].name_group,d4[i].hours);
  kol+=2;  
  printf("\n------------------------------------------------------------");
  getch();
  delete d3;
  delete []d4;
}
C++
1
2
3
4
5
6
7
8
class Disc
{
  public:
  char namedisc[20];
  char teacher_name[20];
  char name_group[10];
  int hours;
};
Тут я просто вывожу в табличке свой класс, просто 4 способами, через переменную, массив, указатель и дин.массив. Вопрос вот выделении памяти под объекты класса (d1,d2[i],*d3,*d4);
писал sizeof для каждого объекта и получил что
d1=56 байта (тут вроде 3 chara 20+20+10+ 1 int=4 байтам=54 байта, куда выделяются еще 2 байта?)
d2=112 байта (ну тут понятно, что записей в массиве 2, 56+56=112)
d3=4 байта (тут 4 байта при записи sizeof(d3)-т.е. на каждое поле класса, их всего 4 выделяется по 1 байту?)
(а если написать sizeof(*d3) то будет снова 56 байт
d4=4 байта (тут аналогично)
Объясните пожалуйста, как происходит процесс выделения памяти в стеке и куче, ну и про кол-во байтов на объекты класса.
Все это делаю в C++ Builder 6
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2014, 14:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как происходит процесс выделения памяти в стеке и куче (C++):

Как выделяется память на стеке и на куче? Когда нужна ручная очистка? - C++
Всем здрасьте. //1 char s = 's'; //2 char* ss = new char; Во втором случае компилятор выделяет участок памяти, потом мне же её...

Расположение данных в стеке и в куче - C++
Друзья, возник вопрос. Следующий код char length_buffer; ...заполнение length_buffer двоичным представлением целого числа 999... ...

Не могу понять где объект в куче или в стеке ! - C++
Сразу к примеру: class Zombie; { Soldat soldat; // что солдат внутри зомби делает не спрашивайте String name; int ...

Указатели (Выделение памяти в куче) - C++
Чтобы создать в динамически распределяемой памяти переменную типа unsigned short необходимо написать следующее: unsigned short...

Потоки и выделение памяти в куче - C++
Подскажите, кто знает, какие есть тонкости при выделении памяти в куче (new) в потоках отличных от главного. У меня возникают исключения...

Как написать программу для динамического выделения памяти с использованием new - C++
Надо написать прогу, которая выделяет память для структур размером в 2048 байт и обрабатывает ситуацию в случае ее нехватки. Я понятия не...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6631 / 5039 / 466
Регистрация: 14.02.2011
Сообщений: 16,846
16.01.2014, 20:49 #31
Цитата Сообщение от Lers Посмотреть сообщение
может на 8 байт?
разумеется байт это я описался
Цитата Сообщение от Lers Посмотреть сообщение
а может быть такое, что билдер растягивает размер для того чтобы размер был кратен 8 ( т.е. выравниванию)
да так и происходит
только к каждому элементы структуры
например
Цитата Сообщение от Lers Посмотреть сообщение
char namedisc[20];
20 байт но 20 некратно 8 добавит 4 байта =24
Цитата Сообщение от Lers Посмотреть сообщение
char teacher_name[20];
20+4=24
Цитата Сообщение от Lers Посмотреть сообщение
char name_group[10];
10+6=16
Цитата Сообщение от Lers Посмотреть сообщение
int hours;
4+4=8
24+24+16+8=72
мдя чтото я общитался
Цитата Сообщение от Lers Посмотреть сообщение
3 char,1 int =56
такое значение может получится если выравнивание на 4 бита
20+20+10(+2 выравнивания)+4=56
хотя я привожу расчеты по опыту работы с микрософт а как Борланд выравнивает не знаю
1
Lers
13 / 13 / 3
Регистрация: 27.05.2012
Сообщений: 203
16.01.2014, 20:53  [ТС] #32
Всем большое спасибо за помощь! С выравниванием большое спасибо, разобрался, а про борланд сам поищу, может найду правду!
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.01.2014, 20:59 #33
Цитата Сообщение от Lers Посмотреть сообщение
С выравниванием большое спасибо, разобрался, а про борланд сам поищу, может найду правду!
Там же есть выравнивание по байту (на скрине видно), или тут теоретические вопросы выравнивания выясняются?
0
Lers
13 / 13 / 3
Регистрация: 27.05.2012
Сообщений: 203
16.01.2014, 21:20  [ТС] #34
Цитата Сообщение от alsav22 Посмотреть сообщение
Там же есть выравнивание по байту (на скрине видно), или тут теоретические вопросы выравнивания выясняются?
да не было конкретной вопроса, выравнивание по байту - оно не будет увеличивать размер, я так понимаю?
затестил с выравниванием по байту, действительно не увеличивает размер
C++
1
2
3
4
5
6
7
8
class Disc
{
  public:
  char namedisc[20];
  char teacher_name[20];
  char name_group[10];
  int hours;
};
20+20+10+4=54 байта.
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.01.2014, 21:22 #35
Цитата Сообщение от Lers Посмотреть сообщение
выравнивание по байту - оно не будет увеличивать размер
...
0
Lers
13 / 13 / 3
Регистрация: 27.05.2012
Сообщений: 203
16.01.2014, 21:24  [ТС] #36
Цитата Сообщение от alsav22 Посмотреть сообщение
...
ну я имею ввиду конкретно мой пример
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.01.2014, 21:56 #37
Цитата Сообщение от Lers Посмотреть сообщение
ну я имею ввиду конкретно мой пример
Имеете ввиду, что sizeof() выдаст? При выравнивании по байту, выдаст сумму размеров полей.
0
ValeryS
Модератор
6631 / 5039 / 466
Регистрация: 14.02.2011
Сообщений: 16,846
16.01.2014, 22:00 #38
Цитата Сообщение от alsav22 Посмотреть сообщение
если объекты в куче, то sizeof() нужно не к указателям применять.
а к чему
указатель то хоть размер указателя даст
а размер объекта кто?
придется размер структуры( класса) высчитывать
sizeof (Disc)
а сколько памяти под этот объект выделится одному менеджеру известно

Добавлено через 1 минуту
Lers,
введи код который я привел и увидишь как в зависимости от выравнивания будут размещаться поля
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.01.2014, 22:08 #39
Цитата Сообщение от ValeryS Посмотреть сообщение
а к чему
указатель то хоть размер указателя даст
а размер объекта кто?
А так размер объекта не даст?
C++
1
sizeof(*d3);
0
ValeryS
Модератор
6631 / 5039 / 466
Регистрация: 14.02.2011
Сообщений: 16,846
16.01.2014, 22:11 #40
Цитата Сообщение от alsav22 Посмотреть сообщение
А так размер объекта не даст?
попробуй
у меня сейчас нет компилятора под рукой
но помню что пытался считать размер массива ничего не получилось, приходилось запоминать
с объектами может быть тоже самое, а может и нет
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.01.2014, 22:18 #41
Цитата Сообщение от ValeryS Посмотреть сообщение
но помню что пытался считать размер массива ничего не получилось, приходилось запоминать
с объектами может быть тоже самое, а может и нет
Не посмотрел, что у него массивы. С массивами, конечно, не получится, с объектами нормально выдаёт размер.
1
Lers
13 / 13 / 3
Регистрация: 27.05.2012
Сообщений: 203
16.01.2014, 22:20  [ТС] #42
Цитата Сообщение от alsav22 Посмотреть сообщение
А так размер объекта не даст?
C++
1
sizeof(*d3);
так выдается размер объекта с выравниванием = 56 байт

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Не посмотрел, что у него массивы. С массивами, конечно, не получится, с объектами нормально выдаёт размер.
хм...
C++
1
printf("\n d2 memory = %d",sizeof(d2));
(d2 массив) (код из 1 поста)
выдает 112 байт (56+56 т.к. массив d2[2]);
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.01.2014, 22:22 #43
Цитата Сообщение от Lers Посмотреть сообщение
хм...
С динамическими.
0
Lers
13 / 13 / 3
Регистрация: 27.05.2012
Сообщений: 203
16.01.2014, 22:25  [ТС] #44
Как происходит процесс выделения памяти в стеке и куче
вот sizeof к каждому объекту!
0
ValeryS
Модератор
6631 / 5039 / 466
Регистрация: 14.02.2011
Сообщений: 16,846
16.01.2014, 22:27 #45
опять сообщение потерялось
повторюсь
Цитата Сообщение от alsav22 Посмотреть сообщение
с объектами нормально выдаёт размер.
не знал
надо будет попробовать
никаких подводных камней?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2014, 22:27
Привет! Вот еще темы с ответами:

Динамическое выделение памяти. Ошибки в куче - C++
Функция чтения данных из ячейки экселя wchar_t *DataInCell( Excel::_WorksheetPtr Sheet, int Row, int Col ) Excel::RangePtr Cell; ...

Нужно перевести из С++ в C строку с выделением памяти в куче - C++
Есть функция, для определения...что ли длинны записанного в файле. int length() { int len=0; Node tmp; ...

Выделение памяти на стеке - C++
Добрый день. Часто в учебниках и на форуме я встречал такое выражение как &quot;переменная создаётся в (или на) стеке&quot;. Мне непонятно, что это...

Нужно ли удалять указатель на символьный массив созданный в куче(динамически распределяемой памяти) - C++
Подскажите, программа состоит из 2 функций (main и fun), программа меняет значение указателя на символьный массив созданный в динамически...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.01.2014, 22:27
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru