C ++项目遇到内存碎片问题,并尝试了以下内容:
nedmalloc- 未通过压力测试(15小时后坠毁),这意味着它在大多数情况下都有效,但不是全部。与其他分配器相比,内存使用量更多。
jemalloc- 尚未准备好用于Windows?
tcmalloc- 使用静态链接的主机代码编译,但与CRT符号冲突。我可以使用像tc_malloc(...)这样的别名构建我自己的包装器进行分配吗?怎么做?
有何评论?提前谢谢。
答案 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