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

Исходный код malloc - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.97
M__A__K
47 / 47 / 2
Регистрация: 09.11.2010
Сообщений: 306
29.11.2011, 18:15     Исходный код malloc #1
Нужен исходный код функции malloc. К сожалению, поиск результатов не принёс.
В качестве ответа хотелось бы видеть либо код, либо ссылку на код
Заранее благодарен
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
29.11.2011, 18:18     Исходный код malloc #2
http://www.google.com/codesearch#pFm...lloc.c&type=cs
fasked
29.11.2011, 18:24
  #3

Не по теме:

Nameless One, а я думал Google code search уже прикрыли Потом погуглил

будет закрыт вместе с доступом к API 15 января 2012 года

Nameless One
29.11.2011, 18:32
  #4

Не по теме:

fasked, а можно ссылочку, почему это они его закрывают? Не нужен? А то я фак ихний проглядел, ничего не нашел

fasked
29.11.2011, 18:35
  #5

Не по теме:

Nameless One, вроде как доходов не приносил. Есть только ответ от девелоперов сервиса вот здесь - http://groups.google.com/group/googl...2e2908c47df068

M__A__K
47 / 47 / 2
Регистрация: 09.11.2010
Сообщений: 306
29.11.2011, 18:35  [ТС]     Исходный код malloc #6
у меня дилемма: программист профессионал мне говорит, что malloc не намного проигрывает (если вообще проигрывает) HeapAlloc в производительности + с ней меньше возни, посему следует использовать именно malloc; преподаватель же в институте заверяет, что malloc реализована через HeapAlloc и проигрывает ей в производительности (т.к. кроме непосредственного вызова HeapAlloc там ещё находится куча проверок), путём отказа от malloc в сторону HeapAlloc при интенсивной работой с памятью, ему (по его словам) удавалось выиграть по времени в 2 раза, потому следует использовать HeapAlloc.
в коде я вызова HeapAlloc не нашёл (но не факт, что данный вызов скрывается в каком-нибудь другом коде, на который ссылается выше предложенный код)
так что же лучше использовать?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.11.2011, 18:39     Исходный код malloc #7
M__A__K, HeapAlloc функция из Windows API. Скорее всего malloc в Win32 реализован именно через нее. В реализации glibc само собой такого нет. Лично я бы использовал malloc.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
29.11.2011, 18:40     Исходный код malloc #8
M__A__K, HeapAlloc - это такая WinAPI-функция?
Через что сделан malloc - зависит полностью от реализации. Может быть, на винде для cl.exe он всегда сделан через HeapAlloc. Но используя его вместо стандартной функции, ты ограничиваешь себя одной платформой. А по ссылке - исходники libc для яблока
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
29.11.2011, 18:47     Исходный код malloc #9
Вариант от мелкомягких.
M__A__K
47 / 47 / 2
Регистрация: 09.11.2010
Сообщений: 306
29.11.2011, 18:47  [ТС]     Исходный код malloc #10
спасибо

так а реально ли значительно выиграть в производительности, если использовать HeapAlloc вместо malloc?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.11.2011, 18:48     Исходный код malloc #11
Цитата Сообщение от M__A__K Посмотреть сообщение
а реально ли значительно выиграть в производительности, если использовать HeapAlloc вместо malloc?
Реально, но стоит ли оно того?
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
29.11.2011, 18:50     Исходный код malloc #12
M__A__K, а ты напиши тестовую программу, сделай замеры и выложи результаты сюда. Думаю, результаты будут интересны не только тебе.
Обычно стандартные функции на отдельной платформе как раз и определены в рамках API системы. А стандартные функции лишь предоставляют более простой и унифицированный интерфейс
M__A__K
47 / 47 / 2
Регистрация: 09.11.2010
Сообщений: 306
29.11.2011, 18:51  [ТС]     Исходный код malloc #13
PraZuBeR, всё равно без HeapAlloc
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
29.11.2011, 18:52     Исходный код malloc #14
Немного подебажил malloc в студии, в итоге пришел в функцию
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
__forceinline void * __cdecl _heap_alloc (size_t size)
 
{
#ifndef _WIN64
    void *pvReturn;
#endif  /* _WIN64 */
 
    if (_crtheap == 0) {
        _FF_MSGBANNER();    /* write run-time error banner */
        _NMSG_WRITE(_RT_CRT_NOTINIT);  /* write message */
        __crtExitProcess(255);  /* normally _exit(255) */
    }
 
#ifdef _WIN64
    return HeapAlloc(_crtheap, 0, size ? size : 1);
#else  /* _WIN64 */
    if (__active_heap == __SYSTEM_HEAP) {
        return HeapAlloc(_crtheap, 0, size ? size : 1);
    } else
    if ( __active_heap == __V6_HEAP ) {
        if (pvReturn = V6_HeapAlloc(size)) {
            return pvReturn;
        }
    }
#ifdef CRTDLL
    else if ( __active_heap == __V5_HEAP )
    {
        if (pvReturn = V5_HeapAlloc(size)) {
            return pvReturn;
        }
    }
#endif  /* CRTDLL */
 
    if (size == 0)
        size = 1;
 
    size = (size + BYTES_PER_PARA - 1) & ~(BYTES_PER_PARA - 1);
 
    return HeapAlloc(_crtheap, 0, size);
 
#endif  /* _WIN64 */
}
Так что да, на винде malloc сделан через HeapAlloc.
Погружение: malloc -> _nh_malloc_dbg -> _nh_malloc_dbg_impl -> _heap_alloc_dbg_impl -> _heap_alloc -> HeapAlloc
M__A__K
47 / 47 / 2
Регистрация: 09.11.2010
Сообщений: 306
29.11.2011, 18:56  [ТС]     Исходный код malloc #15
PraZuBeR, вот она! вот она, рыба моей мечты!

Nameless One, сейчас сделаю
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
29.11.2011, 18:57     Исходный код malloc #16
Цитата Сообщение от fasked Посмотреть сообщение
Реально
Я вот только на счёт "значительно" сомневаюсь. Если переноса программы на немелкомягкие платформы абсолютно точно не предполагается, при этом требования к программе за гранью фанатизма, наверное лучше исключительно WinAPI функциями пользоваться. И то, что-то не верится, чтобы malloc аж в 2 раза медленнее оказалась. Может код кривой был?..
M__A__K
47 / 47 / 2
Регистрация: 09.11.2010
Сообщений: 306
29.11.2011, 19:28  [ТС]     Исходный код malloc #17
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
#include <iostream>
#include <Windows.h>
#include <time.h>
#include <conio.h>
 
using std::cin;
using std::cout;
using std::endl;
 
const int TEST_QUANTITY = 100000;
 
int main()
{
    unsigned int mem_size[TEST_QUANTITY];
    srand( (unsigned int) time( NULL ) );
    for ( int i = 0; i < TEST_QUANTITY; mem_size[i] = rand(), ++i );
    
    int begin_time;
    int end_time;
    int * ptr;
 
    begin_time = GetTickCount();
    for ( int i = 0; i < TEST_QUANTITY; ++i )
    {
        ptr = (int *) malloc( mem_size[i] * 4 );
        free( ptr );
    }
    end_time = GetTickCount();
 
    cout << "Malloc total time: " << end_time - begin_time << endl;
 
    HANDLE hHeap = GetProcessHeap();
 
    begin_time = GetTickCount();
    for ( int i = 0; i < TEST_QUANTITY; ++i )
    {
        ptr = (int *) HeapAlloc( hHeap, 0, mem_size[i] * 4 );
        HeapFree( hHeap, HEAP_NO_SERIALIZE, ptr );
    }
    end_time = GetTickCount();
 
    cout << "HeapAlloc total time: " << end_time - begin_time << endl;
 
    cout << "\nPress any key...";
    _getch();
 
    return 0;
}
при таком раскладе у меня для malloc ~ 900, а для HeapAlloc ~ 40
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
29.11.2011, 19:45     Исходный код malloc #18
Цитата Сообщение от M__A__K Посмотреть сообщение
при таком раскладе у меня для malloc ~ 900, а для HeapAlloc ~ 40
Ваш код, абсолютно ничего не менял:
Код
C:\c_cpp\system>g++ -o malloc_vs_heapalloc malloc_vs_heapalloc.cpp

C:\c_cpp\system>malloc_vs_heapalloc.exe
Malloc total time: 593
HeapAlloc total time: 594

Press any key...
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.11.2011, 19:50     Исходный код malloc #19
easybudda, а если мелкомягким cl попробовать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2011, 19:50     Исходный код malloc
Еще ссылки по теме:

C++ Исправьте исходный код
C++ С++ загрузить исходный код в проект
Скомпилировать исходный код C++

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

Или воспользуйтесь поиском по форуму:
M__A__K
47 / 47 / 2
Регистрация: 09.11.2010
Сообщений: 306
29.11.2011, 19:50  [ТС]     Исходный код malloc #20
хм
я изначально компилировал в VS 2010, в Debug режиме. сейчас поменял на Release и у меня результаты для malloc теперь тоже ~ 40
Yandex
Объявления
29.11.2011, 19:50     Исходный код malloc
Закрытая тема Создать тему
Опции темы

Текущее время: 05:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru