Замена Windows tcmalloc со статической связью - PullRequest
2 голосов
/ 28 сентября 2010

Проект C ++ столкнулся с проблемой фрагментации памяти и попытался выполнить следующее:

  1. nedmalloc - не прошел стресс-тест (сбой через 15 часов), то есть он работает в большинствеслучаев, но не все.И больше памяти, чем у других распределителей.

  2. jemalloc - Не готов для Windows?

  3. tcmalloc - скомпилирован с кодом хоста со статическим связыванием, но конфликтует с символами CRT.Могу ли я просто использовать псевдоним, например, tc_malloc (...), чтобы создать свою собственную оболочку для выделения?Как это сделать?

Есть комментарии?Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 19 февраля 2015

Существует проект jemalloc для визуальной студии 2008, 2010 и 2013 годов. https://github.com/shines77/jemalloc-win32

Я предполагаю, что это означает, что jemalloc можно использовать в Windows.

Но я еще не пробовал. Проверьте это сами.

1 голос
/ 28 сентября 2010

Настройте проект на использование Windows Low Fragmentation Heap (LFH), используя этот API в начале программы.Это может решить вашу проблему без дополнительной работы над пользовательскими реализациями.

Пример кода, взятый непосредственно из MSDN:

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

#define HEAP_LFH 2

int __cdecl _tmain()
{
    BOOL bResult;
    HANDLE hHeap;
    ULONG HeapInformation;

    // 
    // Note: The HeapSetInformation function is available on Windows 2000 with SP4
    // only if hotfix KB 816542 is installed. To run this example on Windows 2000,
    // use GetProcAddress to get a pointer to the function if available.
    //

    //
    // Enable heap terminate-on-corruption. 
    // A correct application can continue to run even if this call fails, 
    // so it is safe to ignore the return value and call the function as follows:
    // (void)HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
    // If the application requires heap terminate-on-corruption to be enabled, 
    // check the return value and exit on failure as shown in this example.
    //
    bResult = HeapSetInformation(NULL,
                                 HeapEnableTerminationOnCorruption,
                                 NULL,
                                 0);

    if (bResult != FALSE) {
        _tprintf(TEXT("Heap terminate-on-corruption has been enabled.\n"));
    }
    else {
        _tprintf(TEXT("Failed to enable heap terminate-on-corruption with LastError %d.\n"),
                 GetLastError());
        return 1;
    }

    //
    // Create a new heap with default parameters.
    //
    hHeap = HeapCreate(0, 0, 0);
    if (hHeap == NULL) {
        _tprintf(TEXT("Failed to create a new heap with LastError %d.\n"),
                 GetLastError());
        return 1;
    }

    //
    // Enable the low-fragmenation heap (LFH). Starting with Windows Vista, 
    // the LFH is enabled by default but this call does not cause an error.
    //
    HeapInformation = HEAP_LFH;
    bResult = HeapSetInformation(hHeap,
                                 HeapCompatibilityInformation,
                                 &HeapInformation,
                                 sizeof(HeapInformation));
    if (bResult != FALSE) {
        _tprintf(TEXT("The low-fragmentation heap has been enabled.\n"));
    }
    else {
        _tprintf(TEXT("Failed to enable the low-fragmentation heap with LastError %d.\n"),
                 GetLastError());
        return 1;
    }

    return 0;
}
0 голосов
/ 08 июля 2011

Intel TBB предоставляет распределитель, который может работать. http://threadingbuildingblocks.org/download.php

0 голосов
/ 28 сентября 2010

есть также несколько других доступных распределителей, таких как malloc (dlmalloc) Дуга Лай или распределитель орды


nedmalloc - не прошел стресс тест (разбился через 15 часов), что означает, что это работает в большинстве случаев но не все.

посмотрите, можете ли вы отследить, где и почему он рухнул в первую очередь, прежде чем покинуть его, это может быть просто ошибкой с вашей стороны, также проверьте репозиторий SVN от ned, возможно, уже есть решение вашей проблемы.

tcmalloc - скомпилирован с кодом хоста с статическое связывание, но конфликт с CRT символы. Могу ли я просто использовать псевдоним как tc_malloc (...), чтобы построить свой собственный обертка для выделения? Как сделать что?

Я бы сказал, что лучше всего сохранить символы CRT нетронутыми (на всякий случай), поэтому идите вперед и отредактируйте проект, чтобы вместо этого соответствующие символы следовали соглашению, которое вы желаете (в конце концов, у вас есть источник по причине)

...