1000 double 有多大?

how big are 1000 double?

我正在学习 C++,其中一节课是关于异常处理的代码。该代码不是我的,它只是 "try and catch" 的示例。所以这个问题不是关于代码质量

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

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

我用 sizeof(double) 得到 1 双倍的大小以确认它是 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);
}
}

你完全正确。应该是:

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

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

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

如果您想检查使用 new 可以分配的最大内存量,您可以考虑使用类似二进制搜索的过程来获取大小;我不会把它拼出来,以防那是你的作业。 (当然,这也不准确,因为其他进程的内存使用会波动。)

也考虑阅读:How to get available memory C++/g++?


最后,吹毛求疵:

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