malloc没有分配指定的内存(64位)
malloc not allocating the specified memory (64 bit)
我的系统上有32 GB的RAM,我想读取并在内存中保留一个15 GB的文件。当我尝试执行以下代码时,输出为:"n read=1073741824",这正好对应于1GB,而它应该具有与文件大小相对应的读取字节。
我甚至检查了系统资源管理器的运行情况,结果正好增加了1GB,这意味着malloc没有像预期的那样分配17GB的空间。
对于64位系统,我可以读取高达8TB的数据(对于32位系统,它是2GB或更具体的1.5GB)。
我在64位机器和操作系统上,我已经配置了Visual C++,通过以下步骤构建和执行64位二进制文件:Intel Link[通过检查int的大小验证它是64位的-以前是4字节,现在是8字节]
为了分配和使用大于1GB的内存,我可以调整什么?
#include <stdio.h>
#include <cstdlib>
#define PATH "C:\train"
#define SIZE 17*1024*1024*1024
int main()
{
FILE * fp = fopen(PATH, "r");
char* buff = (char*)malloc(SIZE);
int nRead = fread(buff, 1, SIZE, fp);
buff[nRead] = 0;
printf("n read = %dn", nRead);
int a;
scanf("%d" ,&a);
return 0;
}
问题是17*1024*1024*1024
是类型为int
的文字,而int
在Windows上有四个字节宽。您错误地认为int
在64位Windows中是8字节宽的。事实并非如此。它有4个字节宽。显然,一个4字节的整数不能容纳你想要放入其中的值
您需要使用64位整数文字:
17*1024*1024*1024ull
相关文章:
- 64位机器上的C++内存对齐
- 从C/C++(Win64)中的内存加载64位DLL
- 如何从32位流程中获取可靠的内存使用信息以进行64位过程
- boost::OSX 上 32 位和 64 位程序之间共享内存中的进程间同步机制(互斥体、条件)
- 如何测量 64 位程序中 32 位进程的内存使用情况
- 使用Solaris 64位或Linux 32位到Linux 64位的内存映射文件
- 64位Windows上应用程序的最大可用内存是多少
- 64位C++二进制文件消耗巨大的内存,即使二进制文件的大小也是巨大的
- 使用硬件内存保护对64位硬件进行数组边界检查
- malloc没有分配指定的内存(64位)
- 在现代 64 位系统上,可能导致内存分配失败的原因
- boost::32位和64位进程之间的进程间共享内存
- 内存碎片整理在64位系统上仍然相关吗
- 在64位系统中分配超过4GB的内存
- 如果其他程序在64位窗口中使用太多,那么32位程序是否真的会内存不足
- 如何避免在64位指针上浪费内存
- 在64位操作系统中运行的32位应用程序可以寻址的不同内存的数量是多少?
- 从32位进程获取64位进程内存的入口点
- 强制内存分配从 64 位 Linux 上的较高地址 (>4GB) 分配
- 奇怪的 malloc 行为不允许在 64 位进程上分配超过 2GB 的内存