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 这样的"幻数"。使用
enum
或constexpr
定义常量。例如:enum { Kilo = 1000 };
. - 似乎没有充分的理由在这样的程序中使用
double
- 这与浮点运算无关。
你是绝对正确的。它应该是:
cerr << "The memory is used up. " << sizeof(double) * i
<< " Kilobyte were available." << endl;
相关文章:
- 如何在 C# 中映射双 C 结构指针?
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- C++我需要了解在哪里使用指针和双指针
- C++中的双指针类型转换
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 我想知道长双倍和双倍之间的区别
- 多线程双缓冲区
- C++,指针数组,指向双链表中的条目
- 如果基类包含双指针成员,则派生类的构造函数
- 结构和双指针隐藏在其他结构中,多层混淆
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- 如何使用原子指针执行双缓冲
- C++长双大"safe"整数
- 1000双倍有多大?
- C++(双精度)0.700 * int(1000) => 699(不是双精度问题)