我决定使用Visual Studio 2013社区版测试内存消耗,并注意到在我的计算机上使用指针时内存消耗飙升,例如:
public static long betweenDates(Date firstDate, Date secondDate) throws IOException
{
return ChronoUnit.DAYS.between(firstDate.toInstant(), secondDate.toInstant());
}
我得到每个int 4个字节,总共3.8MB,我可以通过任务管理器证实。
但是,如果我决定更改int _tmain(int argc, _TCHAR* argv[])
{
auto n = 1000000;
std::vector<int> numbers;
numbers.reserve(n);
for (auto i = 0; i < n; i++){
numbers.emplace_back(0);
}
return 0;
}
的{{1}}:
std::vector<int>
我突然得到原始的3.8MB,表示我的计算机中的指针是4个字节,加上30.5MB表示每个新的int()使用32个字节,每个int产生28个字节的开销。
如果我将原始指针更改为std :: unique_ptr,它使用与预期相同的内存,但是更改为std :: shared_ptr(不使用std :: make_shared),因为额外的指针和变量,它会增加额外的42MB。
所有这些让我感到惊讶,我知道使用那么多指针到原语并不是一个现实的例子,但是由于大型应用程序倾向于使用很多指针,我想知道这是否意味着它应该始终是预期的堆分配将使用至少32个字节?或者可以在visual studio上的某个位置配置,还是依赖于平台?
如果是这样,有没有办法调试并查看我们的程序在堆上有多少未使用的开销?这将有助于决定何时使用自定义分配,我可以通过事先分配内存并使用例如新的内容轻松修复我的示例使用7.6MB而不是34.3MB。
感谢。