vs2015使用tcmalloc(windows)
编译lib库
1、https://github.com/gperftools/gperftools 去tag中下载了2.4版本(最新的2.9.1版本 用了c++17的新特性折叠表达式,vs2015不支持 有2个unittest测试用例工程编译失败)
2、在下载的目录中 .sln 打开vs工程
3、配置x64环境 (可以仿照下默认x86配置修改)
4、编译生成 libtcmalloc_minimal.lib
2.4.91 版本也有2个unittest工程编译失败,跟编译器有关,在vs2019中可以编译通过。
vs2015表现
// a.cpp文件
namespace tcmalloc { bool EnterStacktraceScope(void) { return true; } }
// b.cpp文件
namespace tcmalloc { bool EnterStacktraceScope(void); } int main() { tcmalloc::EnterStacktraceScope(); system("pause"); return 0; }
链接报错:
error LNK2019: 无法解析的外部符号 "bool __cdecl tcmalloc::EnterStacktraceScope(void)" (?EnterStacktraceScope@tcmalloc@@YA_NXZ),函数 _main 中引用了该符号
1>C:\Users\Floyd\source\repos\learnCpp\Debug\learnCpp.exe : fatal error LNK1120: 1 个无法解析的外部命令
使用vs2019(语言标准c++14/c++17)都不会出现该报错。
使用:
1、使用dll的方式 配置链接器 常规-》 附加库目录 和 输入-》附加依赖项,并把对应的dll拷贝到exe目录下
2、需要在工程项目属性==》链接器 ==》输入=》强制符号引用中加入 __tcmalloc
3、用malloc 和 free 对小内存简单分配测试,速度变为了原来的3倍多
FAQ:
修改x64环境遇到的问题:
1、LINK : warning LNK4078: multiple “.text” sections found with different attributes (40000040)
工程项目属性 ==》 c/c++ ==》代码生成 ==》 启动最小重新生成 ==》改为是(/Gm)
2、error LNK2019: 无法解析的外部符号 __imp___CrtDbgReportW
工程项目属性->C/C++->代码生成-> 运行库, "多线程 (/MT) " 修改为 "多线程调试(/MTd)"