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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.73
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
#1

Размер кучи - C++

17.11.2009, 19:41. Просмотров 3932. Ответов 17
Метки нет (Все метки)

С помощью какой библиотечной ф-ции или как узнать размер кучи в языке Си?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2009, 19:41     Размер кучи
Посмотрите здесь:

Размер стэка и кучи - C++
Насколько я знаю, куча и стек растут в направлении друг-дружки в общей куче. Однако, я с удивление обнаружил, что выделить локальный массив...

Размер бинарной кучи, процедура heapify - C++
Не могу понять, каким образом надо работать с параметром "размер кучи" при реализации сортировки пирамидой. В псевдокоде написано, что в...

Получать различные начала кучи при создании кучи внутри цикла - C++
Можно ли как-то такое провернуть, чтобы на каждой итерации цикла получались различные адреса (выбираются ОС) на начало кучи (периодические...

Повреждние кучи - C++
Понимаю, тема стара как мир, но похожих случаев не нашел, к сожалению. Есть консольное приложение, в котором реализуется СУБД библиотеки...

Повреждение кучи - C++
Есть код #include <iostream> using namespace std; struct STUDENT { char NAME; int GROUP; int SES; };

Ошибка кучи - C++
Выдает ошибку: "ОС Windows инициировала точку останова в Lab2.exe.Это может быть вызвано повреждением кучи и указывает на ошибку в Lab2.exe...

Повреждение кучи - C++
#ifndef _TASK2_H_ #define _TASK2_H_ #include <iostream> using namespace std; namespace TeamResult { static int...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
R0mm
Псевдо программист
192 / 113 / 15
Регистрация: 19.09.2009
Сообщений: 303
17.11.2009, 21:47     Размер кучи #2
некорректно сформулирован вопрос!..
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
17.11.2009, 21:53  [ТС]     Размер кучи #3
хорошо - как с помощью языка Си узнать размер дозволеной динамически распределяемой области памяти?
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
17.11.2009, 21:54     Размер кучи #4
Насколько знаю, в Си нет такой стандартной функции, для этого юзаются ОС-зависимые вызовы.
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
17.11.2009, 21:56  [ТС]     Размер кучи #5
Цитата Сообщение от Gravity Посмотреть сообщение
Насколько знаю, в Си нет такой стандартной функции, для этого юзаются ОС-зависимые вызовы.
А как это сделать или поделитесь ссылкой если можно?
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
17.11.2009, 21:58     Размер кучи #6
В линуксе - mallinfo, malloc_stats или команда pmap из терминала. В винде без понятия.
R0mm
Псевдо программист
192 / 113 / 15
Регистрация: 19.09.2009
Сообщений: 303
17.11.2009, 22:13     Размер кучи #7
int *a;
int n;
читать(n);
a = new int[n];
if (a==NULL) печатать("нехватает места");
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
17.11.2009, 23:37  [ТС]     Размер кучи #8
Цитата Сообщение от R0mm Посмотреть сообщение
int *a;
int n;
читать(n);
a = new int[n];
if (a==NULL) печатать("нехватает места");
Короч замутил самодельную:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
int main(void)
{
    int *p, s;
    
  do {
    scanf("%u", &s);
    p =(int *) malloc(s);
      if (p==NULL) {
         printf("%d Stop\n", s);
         free(p);
      }
      else {
         printf("%d\n Run\n", s);
         free(p);
      }    
  }while (s!=1);
    return 0;
}
дозволено где-то 80,95 Гб
но программа как-то странно справлялась с выводом значения s(моего параметра)
например если ввести s=100Гб
то получим s=14Гб
если s=1000Гб
получим s=12Гб

Немогу понять в чем загвоздка?
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
18.11.2009, 03:48     Размер кучи #9
Подозреваю, что в переменной элементарно не хватает места, чтобы вместить большое значение.
Но код все равно неправильный. Реальное выделение памяти происходит не в момент вызова маллок, а когда в эту память что-то записывается. Кроме того, не факт, что память будет взята из кучи, система может смапировать данные и в отображаемой памяти.
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
18.11.2009, 23:56  [ТС]     Размер кучи #10
Цитата Сообщение от Gravity Посмотреть сообщение
Подозреваю, что в переменной элементарно не хватает места, чтобы вместить большое значение.
Но код все равно неправильный. Реальное выделение памяти происходит не в момент вызова маллок, а когда в эту память что-то записывается. Кроме того, не факт, что память будет взята из кучи, система может смапировать данные и в отображаемой памяти.
Вот сдер исходник с нета

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
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
 
struct mallinfo {
   int arena;
   int ordblks;
   int smblks;
   int hblks;
   int hblkhd;
   int usmblks;
   int fsmblks;
   int uordblks;
   int fordblks;
   int keepcost;
 };
 
int *p;
long int x=-100000;
 
int main(void)
{
    p =(int *) malloc(100);
      if (!p) {
              printf("not free memory");
              exit(1);
      }
    *p = x;  
   struct mallinfo info = mallinfo();
 
 printf("Memory in use: %d bytes\n",
        info.uordblks);
 getch();
}
Но выдает результат 0, впечатление будто структура неопределена а используеться как только что созданная,
я здесь правильно все указал?
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
19.11.2009, 00:29     Размер кучи #11
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <malloc.h>
 
int main(void)
{
    struct mallinfo minfo;
    size_t size = 1;
    char *p;
    
    /*
     * mallopt отключит использование хипа
     * (не знаю сработает ли в винде)
     */
    /* mallopt(M_MMAP_THRESHOLD, 0); */
 
    p = (char *) malloc(size);
    minfo = mallinfo();
 
    /* размер хипа, у меня выводит 135152 байт */
    printf("%d\n", minfo.keepcost);
 
    return 0;
}
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
19.11.2009, 11:15  [ТС]     Размер кучи #12
Цитата Сообщение от Gravity Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <malloc.h>
 
int main(void)
{
    struct mallinfo minfo;
    size_t size = 1;
    char *p;
    
    /*
     * mallopt отключит использование хипа
     * (не знаю сработает ли в винде)
     */
    /* mallopt(M_MMAP_THRESHOLD, 0); */
 
    p = (char *) malloc(size);
    minfo = mallinfo();
 
    /* размер хипа, у меня выводит 135152 байт */
    printf("%d\n", minfo.keepcost);
 
    return 0;
}
Пасиб, но неработает Dev-C++ говорит что эта структура неопознана, походу она просто неописана библиотекой:
4 E:\Dev-Cpp\R5.c aggregate `mallinfo minfo' has incomplete type and cannot be defined
19 E:\Dev-Cpp\R5.c invalid use of undefined type `struct mallinfo'

хотелось только узнать в обьявлении struct mallinfo minfo, minfo - являеться переменной?, немного непонятно происходящее в этой строке:
minfo = mallinfo(); что здесь происходит?
Спасибо
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
19.11.2009, 14:31     Размер кучи #13
mallinfo возвращает информацию о внутренней структуре памяти.
Поковырялся в malloc.h, та что в Dev-C++. Оказывается там для хипа есть своя функция.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>
#include <malloc.h>
 
int main(void)
{   
    _HEAPINFO heap;
    
    memset(&heap, 0, sizeof(heap));
    heapwalk(&heap);
    printf("%d\n", heap._size);
 
    getchar();
    return 0;
}
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
19.11.2009, 16:53  [ТС]     Размер кучи #14
Цитата Сообщение от Gravity Посмотреть сообщение
mallinfo возвращает информацию о внутренней структуре памяти.
Поковырялся в malloc.h, та что в Dev-C++. Оказывается там для хипа есть своя функция.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>
#include <malloc.h>
 
int main(void)
{   
    _HEAPINFO heap;
    
    memset(&heap, 0, sizeof(heap));
    heapwalk(&heap);
    printf("%d\n", heap._size);
 
    getchar();
    return 0;
}
Спасибо огромное, теперь буду знать
Evg
Эксперт CАвтор FAQ
17471 / 5709 / 363
Регистрация: 30.03.2009
Сообщений: 15,679
Записей в блоге: 26
19.11.2009, 17:47     Размер кучи #15
Цитата Сообщение от Gravity Посмотреть сообщение
Реальное выделение памяти происходит не в момент вызова маллок, а когда в эту память что-то записывается
Не совсем верно. С точки зрения пользовательской задачи "память выделена". Этот термин означает, что назначен некий дополнительный диапазон адресов, являющийся корректным для данного процесса. А вот физическая память и вправду начинает использоваться только при первом обращении к ней (не обязательно записи)

Добавлено через 19 минут
Да, вот ещё. Максимально допустимый размер вроде бы как нельзя посмотреть никак. Ибо смысла в этом действии нету никакого. Программа работает в многозадачной операционной системе, где куча других задач жрёт память. Если сейчас операционная сиситема будет в состоянии выделить гиг памяти, то через 10 секунд она не сможет выделить вообще ничего (вся память забита, весь swap забит).

Более того, современный malloc может выделять память не только из кучи (heap), но из области, отведённую под динамические библиотеки (по сути дела через mmap)
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
19.11.2009, 17:55  [ТС]     Размер кучи #16
Цитата Сообщение от Evg Посмотреть сообщение
Не совсем верно. С точки зрения пользовательской задачи "память выделена". Этот термин означает, что назначен некий дополнительный диапазон адресов, являющийся корректным для данного процесса. А вот физическая память и вправду начинает использоваться только при первом обращении к ней (не обязательно записи)

Добавлено через 19 минут
Да, вот ещё. Максимально допустимый размер вроде бы как нельзя посмотреть никак. Ибо смысла в этом действии нету никакого. Программа работает в многозадачной операционной системе, где куча других задач жрёт память. Если сейчас операционная сиситема будет в состоянии выделить гиг памяти, то через 10 секунд она не сможет выделить вообще ничего (вся память забита, весь swap забит).

Более того, современный malloc может выделять память не только из кучи (heap), но из области, отведённую под динамические библиотеки (по сути дела через mmap)
Ясно. А есть ли тогда смысл розмещать обьекты в куче, ведь они могут и не поместиться? И для каких задач лучше всего размещать в куче данные?
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
19.11.2009, 18:04     Размер кучи #17
Функции выделения памяти сами определяет где разместить данные. Если размер превышает некоторый предел (в линухе это 128 Кб, если не ошибаюсь), то крупные объекты отправляются в мап, а все, что меньше, то в куче.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2009, 18:20     Размер кучи
Еще ссылки по теме:

Повреждение кучи - C++
Приветствую! Сделал, казалось бы, простую программу, но у меня возникает ошибка на самом ровном месте: void print(node** graph, int V) ...

Повреждение кучи - C++
После выполнения программы выдаёт ошибку Debug Assertion Failed Помогите найти и исправить место из-за которого ошибка, я так понимаю она...

Границы кучи - C++
Как корректно определить границы кучи в любой момент времени без использования функций менеджера дрп в си? Добавлено через 18 часов 7...

Ошибка кучи - C++
Здравствуйте, уважаемые программисты. Возникла у меня такая проблема: Задали сделать курсовую работу на С++ через MFC. Суть задачи: В...

Удаление кучи в куче - C++
Доброго. У меня возник такой вопрос: имею я некую структуру struct inbase { int *data; }; в коде (не важно где) я...


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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17471 / 5709 / 363
Регистрация: 30.03.2009
Сообщений: 15,679
Записей в блоге: 26
19.11.2009, 18:20     Размер кучи #18
Цитата Сообщение от norge_goth Посмотреть сообщение
Ясно. А есть ли тогда смысл розмещать обьекты в куче, ведь они могут и не поместиться? И для каких задач лучше всего размещать в куче данные?
Если ты заведомо знаешь, что у тебя в масииве 10 элементов - то смысла нет. В динамической памяти выделать нужно только то, что рождается в процессе работы программы в заранее неизвестном количестве

Цитата Сообщение от Gravity Посмотреть сообщение
Функции выделения памяти сами определяет где разместить данные. Если размер превышает некоторый предел (в линухе это 128 Кб, если не ошибаюсь), то крупные объекты отправляются в мап, а все, что меньше, то в куче.
Ага. Для того и сделан интерфейс malloc, чтобы программисты его просто вызывали не заморачивались тем, где и как лучше выделить память. А malloc внутри себя сам разберётся, как он будет работать на каждой конкретной платформе
Yandex
Объявления
19.11.2009, 18:20     Размер кучи
Ответ Создать тему
Опции темы

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