- 解释它是如何(为什么)工作的?
当然,我没有任何 RAM,甚至没有这种大小的硬盘。
#include<stdlib.h>
#include <stdio.h>
int main()
{
size_t d[500000000000 + 1];
d[0] = 10;
d[5000000] = 20;
d[50000000] = 30;
d[500000000] = 40;
d[5000000000] = 50;
d[50000000000] = 60;
d[500000000000] = 70;
printf("elements=%llu, size=%llu\n", sizeof(d)/sizeof(size_t), sizeof(d));
printf("d[0]=%llu\n", d[0]);
printf("d[5.000.000]=%llu\n", d[5000000]);
printf("d[50.000.000]=%llu\n", d[50000000]);
printf("d[500.000.000]=%llu\n", d[500000000]);
printf("d[5.000.000.000]=%llu\n", d[5000000000]);
printf("d[50.000.000.000]=%llu\n", d[50000000000]);
printf("d[500.000.000.000]=%llu\n", d[500000000000]);
return 0;
}
结论:
elements=500000000001, size=4000000000008
d[0]=10
d[5.000.000]=20
d[50.000.000]=30
d[500.000.000]=40
d[5.000.000.000]=50
d[50.000.000.000]=60
d[500.000.000.000]=70
我这样收集:(x64)
gcc.exe -m64 test.c -O3 -o test.exe
- 是否可以分配大于 4GB 的内存块(在 64 位应用程序中)?
它如何在 si 中正常工作?(据我了解,malloc 不能再使用了)
你有一个选择
-O3。编译器知道这里并不真正需要数组,并通过简单地替换输出中的常量来执行优化。https://godbolt.org/z/oh3c8T
如果没有此选项,将分配内存。最有可能的是,当执行这样的代码时,程序会崩溃。
https://godbolt.org/z/8a9baM