Замучился.. постоянно получаю ошибку из-за malloc. 1>LIBCMT.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Компиляция с /MT
в хидере прописал
#pragma comment(linker, "/ENTRY:WinMain")
если убрать то все нормально собирается (размер увеличивается на ~30kb, видимо с ней появляется рантайм информация в файле), но эту прагму убирать нельзя.
Что можно сделать? Пробовал заменить malloc на C++ вариант new — все тоже самое.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Если проблема именно в malloc — замени на HeapAlloc с GetProcessHeap. Правда, эта не куча CRT, а другая куча, но раз тебе надо без CRT...
но работает это намного медленнее сишного malloc'а при выделении "средних" обьектов.
Re[3]: malloc без CRT
От:
Аноним
Дата:
25.06.09 15:57
Оценка:
S>но работает это намного медленнее сишного malloc'а при выделении "средних" обьектов.
не будет медленнее. в микрософтовских CRT (по кр мере до 8й включительно) malloc это тупой вызов HeapAlloc'а..
Здравствуйте, Аноним, Вы писали:
S>>но работает это намного медленнее сишного malloc'а при выделении "средних" обьектов. А>не будет медленнее. в микрософтовских CRT (по кр мере до 8й включительно) malloc это тупой вызов HeapAlloc'а..
вы ошибаетесь, для больших размеров- да вызывается HeapAlloc, для маленьких и средних вызывается HeapAlloc большего размера- но если есть свободный кусочек из уже выделенного- которого хватит на требуемую память- будет возвращаться он.
Здравствуйте, Sni4ok, Вы писали:
S>>>но работает это намного медленнее сишного malloc'а при выделении "средних" обьектов. А>>не будет медленнее. в микрософтовских CRT (по кр мере до 8й включительно) malloc это тупой вызов HeapAlloc'а..
S>вы ошибаетесь, для больших размеров- да вызывается HeapAlloc, для маленьких и средних вызывается HeapAlloc большего размера- но если есть свободный кусочек из уже выделенного- которого хватит на требуемую память- будет возвращаться он.
Почитай (а лучше потрейси) исходники CRT.
В MS в общем случае (а там еще есть древние аллокаторы зачем то) все всегда приходит к HeapAlloc
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
S>>>но работает это намного медленнее сишного malloc'а при выделении "средних" обьектов. А>>не будет медленнее. в микрософтовских CRT (по кр мере до 8й включительно) malloc это тупой вызов HeapAlloc'а.. S>вы ошибаетесь, для больших размеров- да вызывается HeapAlloc, для маленьких и средних вызывается HeapAlloc большего размера- но если есть свободный кусочек из уже выделенного- которого хватит на требуемую память- будет возвращаться он. Это вы наивно ошибаетесь.
как видим все что делает malloc — проверяет что внутренний CRT heap (переменная _crtheap) проинициализирован как надо, если нет — то инициализирует его, затем проверяет что юзер просит выделить не 0 байт, и затем просто тупо вызывается HeapAlloc. А все что вы рассказали — делается внутри HeapAlloc'а когда тот уже в себе юзает VirtualAlloc.
И в принципе логично — ntdll'ным хипом пользуется сама система и он должен быть максимально производительным. Если можно сделать быстрее — быстрее должен быть именно виндовый хип а не его надстройки. А тормозными могут быть (я являются) всякие VirtualAlloc'и и тп.
Единственное почему MSVCRT'шный malloc может оказаться быстрее HeapAlloc(GetProcessHeap() -дык это потому что он выделяет не на дефолтовом хипе, а на своем, CRTном. Но ничего не мешает вам сделать свой личный хип HeapCreate'ом.