Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2011, 15:47   #1
dn.xmk
Новичок
Джуниор
 
Регистрация: 25.01.2011
Сообщений: 10
По умолчанию malloc & calloc

Привет !
Суть проблемы: выделяю память для большого числа одинкаовых массивов, суммарным размером в ~ 47 Мб.
Использую сalloc - программа занимает в памяти ~ 205 Мб, если использовать malloc - занимает около ~ 70 Мб.

Везде пишут, что разница между этими 2-мя функциями, только в обнулении памяти в calloc.

Как выяснилось, памяти съедается больше из-за того, что под массив выделяется на самом деле больший объем памяти.
Т.е. для выделяю память malloc под массивы размером в 8 байт, получаю адреса :
0x93eee348 , 0x93eee358 , 0x93eee368 ....

Т.е. фактически выделяется не 8 байт, а 16.

Выделяю память сalloc под массивы размером в 8 байт, получаю адреса:
0x81f3648 , 0x81f3670 , 0x81f3698 ...

Т.е. фактически выделяется не 8 байт, а 40.

Реально ли сделать так, чтобы под массив 8 байт, отводилось 8 байт ?
И почему calloc и malloc "выделяют" память по разному ?

З.Ы.: компиллятор gcc , ОС Linux на VS+Win не проверял
dn.xmk вне форума Ответить с цитированием
Старый 25.01.2011, 15:52   #2
dani6
 
Регистрация: 19.12.2010
Сообщений: 5
По умолчанию может и не в тему

Подскажите пожайлуста где можно скачать Borland C++ . Или может кто-то может скинуть.
dani6 вне форума Ответить с цитированием
Старый 25.01.2011, 15:58   #3
dn.xmk
Новичок
Джуниор
 
Регистрация: 25.01.2011
Сообщений: 10
По умолчанию

Из интернета,блин, можно. Сам недавно узнал, в шоке сижу
http://www.google.com/search?ie=UTF-...B0%D1%82%D1%8C

Последний раз редактировалось dn.xmk; 25.01.2011 в 16:00.
dn.xmk вне форума Ответить с цитированием
Старый 25.01.2011, 16:51   #4
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
Сообщение от dani6 Посмотреть сообщение
Подскажите пожайлуста где можно скачать Borland C++ . Или может кто-то может скинуть.
Borland C++ дрянь, качай http://www.codeblocks.org/

По теме теперь. Странно как-то. Сейчас проведу тесты...
upd:

Собирал с помощью gcc --std=c99 ./main.c

Код:
#include <stdlib.h>
#include<stdio.h>

int main() {
    int n = 10000000;
    int *arr = calloc(n,sizeof(int));
    for( int i = 0; i < n; ++i ) {
      arr[i] = i*i-2;
    }
    getchar();
}
~39050 КиБ

Код:
#include <stdlib.h>
#include<stdio.h>

int main() {
    int n = 10000000;
    int *arr = calloc(n*sizeof(int));
    for( int i = 0; i < n; ++i ) {
      arr[i] = i*i-2;
    }
    getchar();
}
Всё те же ~39050 КиБ

Автор, может ты там напутал чего?
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 25.01.2011 в 17:10.
Obey-Kun вне форума Ответить с цитированием
Старый 25.01.2011, 17:34   #5
dn.xmk
Новичок
Джуниор
 
Регистрация: 25.01.2011
Сообщений: 10
По умолчанию

Врядли )

Попробуй например так :

Код:
int main()
 {
    int ar[4096];
  
    for( int i = 0; i < 4096; i++ ) 
            ar[i] = (int) calloc ( 16, 4);
    getchar();
}
Ну или :

Код:
int main()
{   
    int *tmp;
    for( int i = 0; i < 1048576; i++ ) 
            tmp = (int) calloc ( 16, 4);
    getchar();
}
В последнем примере должно теоретически "скушать" 16*1Мб = 16 Мб памяти.

IRL кушает кушает намного больше.
Ну и для завершения эксперимента меняем calloc на malloc и смотрим на размер.
В моем случае calloc навдыелял 72 Мб , а malloc - 24 , вместо положеных 16 +- поправка на ветер

Последний раз редактировалось dn.xmk; 25.01.2011 в 17:41.
dn.xmk вне форума Ответить с цитированием
Старый 25.01.2011, 17:37   #6
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

В первом случе ты зачем-то сохраняешь указатели как int'ы, зачем?
А во втором ты приводишь calloc к int? Ладно бы если приводил к int*, но вообще приводить не обязательно в С .
Но это всё оффтоп.

Код:
#include <stdlib.h>
#include<stdio.h>

int main()
{   
    int *tmp;
    for( int i = 0; i < 1048576; i++ ) 
            tmp = calloc ( 16, 4);
    getchar();
}
81812 КиБ


Код:
#include <stdlib.h>
#include<stdio.h>

int main()
{   
    int *tmp;
    for( int i = 0; i < 1048576; i++ ) 
            tmp = malloc ( 16* 4);
    getchar();
}
81820 КиБ

Что-то ты чернишь .
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 25.01.2011 в 17:43.
Obey-Kun вне форума Ответить с цитированием
Старый 25.01.2011, 17:47   #7
dn.xmk
Новичок
Джуниор
 
Регистрация: 25.01.2011
Сообщений: 10
По умолчанию

хм. как ты занимаемую память смотришь ?
dn.xmk вне форума Ответить с цитированием
Старый 25.01.2011, 17:49   #8
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

В KDE ctrl+esc нажимаю . Или в htop по перцентажу, там оба показывают 4.2% от моих 2 гигов.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 25.01.2011, 17:54   #9
dn.xmk
Новичок
Джуниор
 
Регистрация: 25.01.2011
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Obey-Kun Посмотреть сообщение
В KDE ctrl+esc нажимаю . Или в htop по перцентажу, там оба показывают 4.2% от моих 2 гигов.
Я в Gnome по System Monitor смотрю.
В принципе, ps -C %AppName% -F , если по RSS смотреть то же самое, что и System Monitor показывает.

Но в любом случае, 81820 КиБ это дофига. Это грубо говоря по 70 байт на массив вместо 16

Последний раз редактировалось dn.xmk; 25.01.2011 в 17:59.
dn.xmk вне форума Ответить с цитированием
Старый 25.01.2011, 17:59   #10
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

16*4*1048576/1024 = 65536
Вполне нормально.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В чем разница между malloc и calloc ? alexobenikov Общие вопросы C/C++ 5 10.02.2010 22:01
SIEGSEGV в malloc() TheVampire Общие вопросы C/C++ 0 25.09.2009 14:32
TForm & TImage & PNG & Прозрачность delphi_beginner Общие вопросы Delphi 7 19.09.2009 08:46
Проблема с malloc Обледеневший Общие вопросы C/C++ 7 14.09.2009 18:06
malloc free Ошибка. BeNN Общие вопросы C/C++ 19 09.07.2009 12:46