Windows tcmalloc替换为静态链接

时间:2010-09-28 09:18:47

标签: c++ windows memory-management tcmalloc

C ++项目遇到内存碎片问题,并尝试了以下内容:

  1. nedmalloc- 未通过压力测试(15小时后坠毁),这意味着它在大多数情况下都有效,但不是全部。与其他分配器相比,内存使用量更多。

  2. jemalloc- 尚未准备好用于Windows?

  3. tcmalloc- 使用静态链接的主机代码编译,但与CRT符号冲突。我可以使用像tc_malloc(...)这样的别名构建我自己的包装器进行分配吗?怎么做?

  4. 有何评论?提前谢谢。

4 个答案:

答案 0 :(得分:1)

将项目设置为在程序开始时使用this API使用Windows低碎片堆(LFH)。这可能会解决您的问题而无需更多自定义实现。

示例代码,直接取自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;
}

答案 1 :(得分:1)

2008年,2010年和2013年的视觉工作室有jemalloc项目。 https://github.com/shines77/jemalloc-win32

我认为这意味着jemalloc可以在windows中使用。

但我还没有尝试过。 自己检查一下。

答案 2 :(得分:0)

还有一些其他分配器可用,例如doug lea's malloc (dlmalloc)the horde allocator


  

nedmalloc-没有通过压力   测试(15小时后坠毁),那   意味着它适用于大多数情况   但不是全部。

看看你是否可以在放弃它之前找到它首先崩溃的地点和原因,它可能只是你身边的错误,也检查了ned的SVN回购,可能已经解决了你的问题。

  

tcmalloc-使用主机代码编译   静态链接,但与之冲突   CRT符号。我可以使用别名吗?   像tc_malloc(...)来构建我自己的   包装分配?怎么做   是什么?

我会说最好保持CRT符号的完整性(以防万一),所以继续编辑投影,以便使符号符合你想要的约定(毕竟你有源于某个原因)

答案 3 :(得分:0)

英特尔的TBB提供了可行的分配器。 http://threadingbuildingblocks.org/download.php