Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
1

Статическая и динамическая память

03.06.2018, 11:36. Показов 6615. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Правда ли это:
1. что и статические, и динамические переменные при запуске программы попадают в одну и ту же часть виртуальной памяти — кучу (heap)?
2. что динамические переменные, как и статические, доступны из любого места программы, если только не было команды освободить участок, занимаемый ими?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.06.2018, 11:36
Ответы с готовыми решениями:

Азы: статическая память, динамическая память, автоматическая память
столько раз приходистя возвращаться к началу, и все благодаря моим преподавателям, которые не...

Статическая память,Динамическая память.
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть отрицательные...

Статическая или динамическая библиотека
Хочу создать свои функции? Какие библиотеки лучше использовать?

Динамическая строка или статическая?
В функцию в качестве параметра передаётся указать на строку символов. Можно ли как то в нутри...

27
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
03.06.2018, 11:42 2
Jzx,
1. Нет
2. Нет
0
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
03.06.2018, 11:55  [ТС] 3
nonedark2008, а что все-таки попадает в кучу, и куда попадает все остальное? И почему 2. Нет ? Помогите пожалуйста разобраться детально с этими вещами.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
03.06.2018, 12:59 4
Цитата Сообщение от Jzx Посмотреть сообщение
а что все-таки попадает в кучу
Статический переменные попадают в стек, динамические - в кучу.

На счет второго я ошибся, неправильно вопрос прочитал. Там ответ да.

Добавлено через 11 минут
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Статический переменные попадают в стек
Я опять не подумал и обманул тебя.
В кучу идут динамические объекты, в стек - локальные. Статические переменные, глобальные переменные обычно хранятся в отдельном участке памяти.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
03.06.2018, 13:08 5
Program code and data.Code begins at the same fixed address for all processes,
followed by data locations that correspond to global C variables. The code and
data areas are initialized directly from the contents of an executable object file.

Heap.The code and data areas are followed immediately by the run-time heap.
Unlike the code and data areas, which are fixed in size once the process begins
running, the heap expands and contracts dynamically at run time as a result
of calls to C standard library routines such as malloc and free.

Shared libraries.Near the middle of the address space is an area that holds the
code and data for shared libraries such as the C standard library and the math
library.

Stack. At the top of the user’s virtual address space is the user stack that
the compiler uses to implement function calls. Like the heap, the user stack
expands and contracts dynamically during the execution of the program. In
particular, each time we call a function, the stack grows. Each time we return
from a function, it contracts.

Kernel virtual memory. The kernel is the part of the operating system that is
always resident in memory. The top region of the address space is reserved for
the kernel. Application programs are not allowed to read or write the contents
of this area or to directly call functions defined in the kernel code.

цитаты из книги Computer Systems Programmer's Perspective.
Миниатюры
Статическая и динамическая память  
0
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204
03.06.2018, 13:24  [ТС] 6
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Статические переменные, глобальные переменные обычно хранятся в отдельном участке памяти.
Что это за отдельный участок и какие там накладываются ограничения?
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
03.06.2018, 13:39 7
Цитата Сообщение от Jzx Посмотреть сообщение
Что это за отдельный участок
Обычный отдельный участок в адресном пространстве созданного процесса. Информация о том, что и где там будет храниться, определяется на этапе компиляции.
Цитата Сообщение от Jzx Посмотреть сообщение
какие там накладываются ограничения
Никаких, за исключением того, что я написал выше.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
03.06.2018, 13:49 8
насколько я помню статические переменные попадают в кэш.
0
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
03.06.2018, 15:17 9
Jzx, всё что вы спрашиваете - это специфика архитектуры процессора и оптимизаций компилятора. Как мне кажется, деление на сегменты и распределение в физической памяти не должно стандартизироваться на уровне языка.
Кликните здесь для просмотра всего текста
Под виндой на x86 можно небольшой тест написать и посмотреть как всё это выглядит.

Консольная тестовая программка:
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include "stdafx.h"
#include "windows.h"
 
int iGlobal;
const int iGlobalConst = 0;
const char* pString1 = "string";
char pString2[] = "string";
 
int pointers_cnt = 0;
const void* pointers[100];
const char* pointers_info[100];
void ptr_info_add(const void* ptr, const char* pInfo);
void ptr_info_sort();
void ptr_info_print();
 
void func1(int arg)
{
    int iFuncLocal;
    static int iFuncStatic;
 
    ptr_info_add(&iFuncLocal, "stack fun1_local_var");
    ptr_info_add(&iFuncStatic, "data fun1_static_var");
    ptr_info_add(&arg, "stack fun1_argument_var");
}
 
void func2(int arg)
{
    int iFuncLocal;
    static int iFuncStatic;
 
    ptr_info_add(&iFuncLocal, "stack fun2_local_var");
    ptr_info_add(&iFuncStatic, "data fun2_static_var");
    ptr_info_add(&arg, "stack fun2_argument_var");
 
    func1(arg);
}
 
int main(int argc, char* argv[])
{
    int iMainLocal;
    static int iMainStatic;
    int* pNew = new int;
    void* pAlloc = malloc(4);
 
    ptr_info_add(0, "???");
    ptr_info_add(&iGlobal, "data global_var");
    ptr_info_add(&iGlobalConst, "const global_const");
    ptr_info_add(pString1, "const global_string");
    ptr_info_add(pString2, "data global_char[]");
    ptr_info_add(&iMainLocal, "stack main_local_var");
    ptr_info_add(&iMainStatic, "data main_static_var");
    ptr_info_add(&main, "code &main");
    ptr_info_add(&func1, "code &fun1");
    ptr_info_add(&func2, "code &fun2");
    ptr_info_add(&printf, "code &printf");
    ptr_info_add(pNew, "heap new");
    ptr_info_add(pAlloc, "heap malloc");
 
    func1(0);
    func2(0);
 
    ptr_info_sort();
    ptr_info_print();
 
    return 0;
}
 
// добавить указатель в список проверок
void ptr_info_add(const void* ptr, const char* pInfo)
{
    pointers[pointers_cnt] = ptr;
    pointers_info[pointers_cnt] = pInfo;
    pointers_cnt++;
}
 
// сортировать список указателей
void ptr_info_sort()
{
    for (int i=0; i<pointers_cnt; i++)
    {
        for (int j=i+1; j<pointers_cnt; j++)
        {
            if (pointers[i] > pointers[j])
            {
                const void* ptr = pointers[i];
                const char* info = pointers_info[i];
                pointers[i] = pointers[j];
                pointers_info[i] = pointers_info[j];
                pointers[j] = ptr;
                pointers_info[j] = info;
            }
        }
    }
}
 
// вывести на экран список указателей и информацию по ним
void ptr_info_print()
{
    for (int i=0; i<pointers_cnt; i++)
    {
        MEMORY_BASIC_INFORMATION mbi;
        SIZE_T sz = VirtualQuery(pointers[i], &mbi, sizeof(mbi));
 
        printf("%p (0x%X / 0x%X) 0x%X 0x%X   '%s'\r\n",
            pointers[i],
            mbi.BaseAddress, mbi.RegionSize,
            mbi.AllocationProtect, mbi.Protect,
            pointers_info[i]);
    }
}
Вариант вывода (будет отличаться при каждом запуске):
Код
00000000 (0x0 / 0x370000) 0x0 0x1   '???'
00391401 (0x391000 / 0xF000) 0x80 0x20   'code &main'
00391591 (0x391000 / 0xF000) 0x80 0x20   'code &fun2'
00391596 (0x391000 / 0xF000) 0x80 0x20   'code &fun1'
003A0BC4 (0x3A0000 / 0x4000) 0x80 0x2   'const global_const'
003A10D0 (0x3A1000 / 0x3000) 0x80 0x2   'const global_string'
003A40C8 (0x3A4000 / 0x2000) 0x80 0x4   'data global_char[]'
003A4258 (0x3A4000 / 0x2000) 0x80 0x4   'data global_var'
003A4580 (0x3A4000 / 0x2000) 0x80 0x4   'data fun1_static_var'
003A4580 (0x3A4000 / 0x2000) 0x80 0x4   'data fun1_static_var'
003A4584 (0x3A4000 / 0x2000) 0x80 0x4   'data fun2_static_var'
003A4588 (0x3A4000 / 0x2000) 0x80 0x4   'data main_static_var'
0073F900 (0x73F000 / 0x1000) 0x4 0x4   'stack fun1_local_var'
0073F910 (0x73F000 / 0x1000) 0x4 0x4   'stack fun1_argument_var'
0073F9E4 (0x73F000 / 0x1000) 0x4 0x4   'stack fun1_local_var'
0073F9E4 (0x73F000 / 0x1000) 0x4 0x4   'stack fun2_local_var'
0073F9F4 (0x73F000 / 0x1000) 0x4 0x4   'stack fun2_argument_var'
0073F9F4 (0x73F000 / 0x1000) 0x4 0x4   'stack fun1_argument_var'
0073FAEC (0x73F000 / 0x1000) 0x4 0x4   'stack main_local_var'
00B35498 (0xB35000 / 0x9000) 0x4 0x4   'heap new'
00B354D8 (0xB35000 / 0x9000) 0x4 0x4   'heap malloc'
55FFBA20 (0x55FFB000 / 0x10E000) 0x80 0x20   'code &printf'
1
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
03.06.2018, 20:26 10
Цитата Сообщение от IchimaruGin Посмотреть сообщение
насколько я помню статические переменные попадают в кэш.
В кэш может попасть все из вышеперечисленного. Но к делу это отношения не имеет.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
03.06.2018, 20:51 11
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Но к делу это отношения не имеет.
я б не сказал что к делу это не имеет отношения. Ну что ж, если любой тип переменной может туда попасть тогда за каких условий она туда попадает?
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
03.06.2018, 21:04 12
Цитата Сообщение от IchimaruGin Посмотреть сообщение
Ну что ж, если любой тип переменной может туда попасть тогда за каких условий она туда попадает?
А причем здесь переменные? В кэш идет блок-памяти и делается упор на то, что, возможно, следующий за ним блок памяти будет тоже использоваться, посему и заносится в кэш тоже, образуя своего рода кэш-линии
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
03.06.2018, 21:10 13
SuperKir, при том что данные хранятся в переменных, разве нет?
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
03.06.2018, 21:13 14
IchimaruGin, данные хранятся в памяти.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
03.06.2018, 21:18 15
SuperKir, ну ок подловил с неточностью высказывания. но ведь мы манипулируем данными в исходном коде через переменные. то есть создаем переменную типа double и о чудо в памяти выделено место под эту переменную. так что вопрос всё ещё открыт. или ты хочешь сказать что мы не можем управлять тем попадет блок памяти в кэш или нет.
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
03.06.2018, 21:21 16
IchimaruGin, в кэш попадает то, что использовалось + следующие блоки до заполнения кэш-линии
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
03.06.2018, 21:24 17
Цитата Сообщение от IchimaruGin Посмотреть сообщение
Ну что ж, если любой тип переменной может туда попасть тогда за каких условий она туда попадает?
Какую переменную процессор прочитал, ту он себе в кэш и кладет. Без участия программиста.
Цитата Сообщение от IchimaruGin Посмотреть сообщение
то есть создаем переменную типа double и о чудо в памяти выделено место под эту переменную. так что вопрос всё ещё открыт. или ты хочешь сказать что мы не можем управлять тем попадет блок памяти в кэш или нет.
Объявление переменной имеет к кешу примерно такое же отношение, как биржа труда к появлению такси под окном.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
03.06.2018, 21:35 18
Цитата Сообщение от Renji Посмотреть сообщение
Какую переменную процессор прочитал, ту он себе в кэш и кладет. Без участия программиста.
спасибо за ответ(я конечно проверю).и кстати она разве не в регистр записывается?
а то предыдущий столько отмахивался от ответа встречными вопросами что я уже устал спрашивать.
Цитата Сообщение от Renji Посмотреть сообщение
Объявление переменной имеет к кешу примерно такое же отношение, как биржа труда к появлению такси под окном.
возможно и так. для того я и спрашивал за каких условий она попадает в кэш.

Добавлено через 3 минуты

Не по теме:

Renji, у лейтенанта выше рейтинг чем у капитана) кто не понял тот поймёт))

0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
03.06.2018, 21:40 19
Цитата Сообщение от IchimaruGin Посмотреть сообщение
спасибо за ответ(я конечно проверю).и кстати она разве не в регистр записывается?
а то предыдущий столько отмахивался от ответа встречными вопросами что я уже устал спрашивать.
Одно другому не мешает. Одна копия в регистр, для работы. Одна копия в кэш, на случай если еще раз по тому же адресу читать будут.
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
03.06.2018, 21:44 20
Цитата Сообщение от IchimaruGin Посмотреть сообщение
а то предыдущий столько отмахивался от ответа встречными вопросами что я уже устал спрашивать.
Если это про меня - то я не задал ни 1 вопроса. И конкретно ответил, что попадает
Цитата Сообщение от SuperKir Посмотреть сообщение
, в кэш попадает то, что использовалось + следующие блоки до заполнения кэш-линии
Цитата Сообщение от Renji Посмотреть сообщение
Какую переменную процессор прочитал, ту он себе в кэш и кладет. Без участия программиста.
0
03.06.2018, 21:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.06.2018, 21:44
Помогаю со студенческими работами здесь

Статическая и динамическая линковка - в чем преимущество каждой?
Помогите разобраться со статической и динамической линковкой. Я правильно понял, что статическая...

Статическая память
Если я на этапе компиляции выделил слишком много памяти. Например зарезервировал память под...

Статическая память и матрицы
сижу задачку делаю! с динамической памятью все нормально получилось! а со статической ошибки...

На каком этапе выделяется статическая память
Если я создаю синглтон Маейрса: class Singleton { public: static Singleton&amp; Instance()...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru