Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 读取5x10^8个不同的数组元素,每次4字节_C++ - Fatal编程技术网

C++ 读取5x10^8个不同的数组元素,每次4字节

C++ 读取5x10^8个不同的数组元素,每次4字节,c++,C++,因此,我正在学习一门组装课程,并被指派为我的电脑制作一个基准程序——不用说,我对这一特殊的部件有点迷恋 正如标题所说,我们应该创建一个函数来读取5x108个不同的数组元素,每次读取4个字节。我唯一的问题是,我甚至认为我不可能创建一个包含5亿个元素的数组?那么我到底应该做什么呢?(作为记录,我试图用C++编写此代码) C++中的代码> /BooST程序 #包括 #包括 使用名称空间std; int main(){ 时钟t1,t2; int readTemp; int*arr=新int[5*1000

因此,我正在学习一门组装课程,并被指派为我的电脑制作一个基准程序——不用说,我对这一特殊的部件有点迷恋


正如标题所说,我们应该创建一个函数来读取5x108个不同的数组元素,每次读取4个字节。我唯一的问题是,我甚至认为我不可能创建一个包含5亿个元素的数组?那么我到底应该做什么呢?(作为记录,我试图用C++编写此代码)

C++中的代码> /BooST程序 #包括 #包括 使用名称空间std; int main(){ 时钟t1,t2; int readTemp; int*arr=新int[5*100000000]; t1=时钟(); cout大小是可能的:

5*10^8*4=~1.9 GB

首先,您需要分配数组(仅动态分配!没有这样的堆栈内存)

对于您的任务,4字节是整数的大小,因此您可以这样做

int* arr = new int[5*100000000];
或者,如果希望更精确,可以将其分配为字节

int* arr = new char[5*4*100000000];
接下来,您需要将内存弄脏(意味着在其中写入内容):

现在,您可以对缓存未命中进行基准测试(我猜这就是它在如此庞大的阵列中的意图):


如果您想要5*10^8次随机访问,您可以在getRandomNumber中进行knuth shuffle,而不是使用纯随机。您的系统尝试分配20亿字节(1907 MiB),而Windows的最大可用内存为2 GB(2048 MiB)。这些数字非常接近。很可能您的系统已将剩余的141 MiB分配给其他内容。尽管您的代码非常小,但操作系统在分配2048 MiB地址空间方面非常自由,浪费了大量内存,例如:

  • C++运行时(标准库和其他库)
  • 堆栈:操作系统分配了大量内存来支持递归函数;没有任何内存并不重要
  • 虚拟内存页之间的填充
  • 仅用于使特定数据段显示在特定地址的填充(例如,在Windows中使用0x00400000表示最低代码地址或类似内容)
  • 过去的填充物

有一个窗口显示正在运行的进程的内存映射。您可以通过添加延迟来使用它(例如
getchar()
)在分配之前,查看该点上最大的连续可用内存块,以及哪些分配阻止它足够大。

粗略估计:4*5亿=2 GB。看起来很合理。“我甚至不认为我有可能创建一个包含5亿个元素的数组?”–为什么不呢?@ParamagneticCroissant在我试图创建数组时,它一直崩溃,所以我想这是因为我没有足够的内存,这似乎很奇怪。@Axalo好吧,它们是整数,所以我假设它们是4字节。@TaiM。可能是因为你试图对它们进行堆栈分配。堆栈不足以实现这一点;寻找动态分配。现在我的问题是std::bad_alloc()错误,我真的需要使用malloc()吗创建阵列本身?尝试使用较小的内存…可能大小太大了。New和malloc对POD类型有相同的影响。是的,我最终不得不减小大小,然后将其相乘以获得适当的阵列大小。为此,我找到了3位不同的老师,试图让它工作,但没有人知道为什么会崩溃?这是操作系统的问题,不是代码的问题。这让我感觉好多了。我必须把这个发给我的教授,这样他才能知道未来。
int* arr = new char[5*4*100000000];
memset(arr,0,5*100000000*sizeof(int));
int randomIndex= GetRandomNumberBetween(0,5*100000000-1); // make your own random implementation
int bytes = arr[randomIndex]; // access 4 bytes through integer