相关疑难解决方法(0)

如何从 ASAN 的紧密循环中排除分配?

在上一个问题中,发现使用最新版本的 GNU libstdc++ 从以空格分隔的人类可读文件( mirror )读取一系列数字会导致大量分配,并随文件大小线性缩放。

鉴于上面链接的文件和这个测试程序:

#include <fstream>

int main(int, char**) {
    std::ifstream ww15mgh("ww15mgh.grd");
    double value;
    while (ww15mgh >> value);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Valgrind--tool=memcheck报告:

==523661==   total heap usage: 1,038,970 allocs, 1,038,970 frees, 59,302,487 
Run Code Online (Sandbox Code Playgroud)

因为这百万分配中的每一个都在operator>>返回之前立即释放,所以没有泄漏并且程序在发布版本中的实际内存占用很小(81KB)。但是,编译-fsanitize=address将大量分配变成了一个真正的问题。

以下是上述程序的总内存占用,运行和不运行 ASAN:

$ g++ stackoverflow.cpp -o _build/stackoverflow
$ /usr/bin/time -v _build/stackoverflow |& grep 'm r'
    Maximum resident set size (kbytes): 3512
Run Code Online (Sandbox Code Playgroud)
$ g++ stackoverflow.cpp -o _build/stackoverflow_asan -fsanitize=address
$ /usr/bin/time -v _build/stackoverflow_asan |& grep 'm r' …
Run Code Online (Sandbox Code Playgroud)

c++ address-sanitizer

5
推荐指数
1
解决办法
163
查看次数

标签 统计

address-sanitizer ×1

c++ ×1