1000双倍有多大?

how big are 1000 double?

本文关键字:1000双      更新时间:2023-10-16

我正在学习c ++,在一堂课中是关于异常处理的代码。代码不是我的,它只是"尝试和捕获"的示例。所以这个问题与代码质量无关

我对这段代码的问题是:内存大小的输出和计算是否正确? 当我分配一个内存块时,new double(1000),大小不是8000字节吗?

cerr 输出仅计为 1kB 而不是 8kB。我错了吗?

我得到了 1 双倍的大小,sizeof(double)确认它是 8 个字节。

#include <iostream>
#include <cstdlib>
#include <new>
using namespace ::std;
int main()
{
int i = 0;
double *q;
try
{
while (1)
{
q = new double[1000];
i++;
}
}
catch (bad_alloc &ex)
{
cerr << "The memory is used up.  " << i
<< " Kilobyte were available." << endl;
exit(1);
}
}

总结一下@Peter在他的评论中所说的内容:您的i变量正在计算分配的数量,而不是分配的内存总量。

但是请注意,即使您"修复"此问题,您得到的也不是"可用内存"的数量,甚至也不是四舍五入到 8000 的倍数的可用内存量。这是因为"可用内存"不是一个定义明确的概念。操作系统可能愿意让您分配亿万字节;但在您开始写入该内存之前,它实际上可能不会对其他进程执行任何可见的操作。即使您确实写入它 - 它也可以将未使用的内存页交换到硬盘/SSD,以便为您正在处理的页面腾出空间。

如果要检查可以使用new分配的最大内存量,则可以考虑使用类似二进制搜索的过程来获取大小;我不会详细说明,以防这是你的家庭作业。(当然,这也不准确,因为其他进程的内存使用会波动。

还可以考虑阅读: 如何获取可用内存 C++/g++?


最后,一些吹毛求疵:

  • 您使用的缩进不一致。这令人困惑。
  • 对于变量来说,i不是一个好名字。num_allocations会更合适。当你使用一个更有意义的名称时,你也会承诺它的语义,这使得将它们混淆起来变得更加困难。
  • 尽量避免像 1000 这样的"幻数"。使用enumconstexpr定义常量。例如:enum { Kilo = 1000 };.
  • 似乎没有充分的理由在这样的程序中使用double- 这与浮点运算无关。

你是绝对正确的。它应该是:

cerr << "The memory is used up.  " << sizeof(double) * i
<< " Kilobyte were available." << endl;