我正在尝试std::deque
查找deque
.
写在简单的 C++ 程序下面,它创建一个deque
容器并推送int
元素的数量。
我想至少遍历容器一次,因此使用 find 算法。
我的主要重点是了解元素数量增加时内存使用量和内存使用量的增长情况。
我尝试使用两种不同的工具进行分析 valgrind massif 和 /usr/bin/time 使用命令行参数 1、2、3、4 运行程序并捕获如下内存
Number of Elements, heap by massif, Peak RSS (resident segment size) by top or time
1024, 4752 Bytes, 4128 Kilo Bytes
2K, 9008 Bytes, 4160 Kilo Bytes
3k, 13104 Bytes, 4176 Kilo Bytes
4k, 17520 Bytes, 4208 Kilo Bytes
根据 valgrind,对于每 1K 元素,大约增加 4K 字节。但 top 或 /usr/bin/time 记录显示,对于每 1K 元素,RSS 会增加 16 千字节或 32 千字节。STL 容器元素默认分配在堆上,因此我希望 valgrind massif 报告的堆大小增长应该与元素数量增加时 top 或 /usr/bin/time 报告的 RSS 增长相匹配。当唯一的 4 KB 额外堆增加时,为什么 RSS 会增长 16 千字节或 32 千字节?除了堆分配之外,是什么导致 RSS 的增加?这里的堆栈是相同的,因为相同的程序使用不同的命令行参数 1、2、3、4 运行。
#include <iostream>
#include <deque>
#include <cstdlib>
#include <cstdint>
#include <ctime>
#include <algorithm>
#include <sys/time.h>
int main ( int argc, char *argv[] )
{
std::deque<uint32_t> int_deque;
int element_count = 1024*10;
if (argc > 1)
{
element_count = 1024*atoi(argv[1]);
}
--element_count;
std::srand(std::time(0));
for (int i=0; i < element_count; ++i)
{
int_deque.push_back(rand());
}
uint32_t num2 = rand();
int_deque.push_back(num2);
if (std::find(int_deque.begin(), int_deque.end(), num2) == int_deque.end())
{
std::cerr << "deque error" << std::endl;
return 1;
}
return EXIT_SUCCESS;
}