s1e37动动手
本帖最后由 houqing1999 于 2023-6-6 09:14 编辑两个问题,
最后的打印语句maxmum*1.0/1024/1027/1024是啥意思
还有用visual stdio运行能运行但是等好大一会儿都没有结果,但是注意到电脑管家的加速球突然到了90%,加速球60%到90%一跳一跳,怎么解决。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
void *block;
int i, count;
size_t maximum = 0;
size_t blocksize[] = {1024 * 1024, 1024, 1};
// 下面从大到小依次尝试
// 先尝试以1024 * 1024为扩大粒度去申请内存空间
// 当malloc返回NULL时,将扩大的粒度缩小为1024继续尝试
// 最终精确到1个字节的粒度扩大maximum的尺寸
for (i = 0; i < 3; i++)
{
for (count = 1; ;count++)
{
block = malloc(maximum + blocksize * count);
if (block)
{
maximum += blocksize * count;
free(block);
}
else
{
break;
}
}
}
printf("malloc在当前环境下申请到的最大空间是:%.2fGB\n", maximum * 1.0 / 1024 / 1024 / 1024);
return 0;
} 首先回答你的第一个问题,关于 maximum * 1.0 / 1024 / 1024 / 1024 这个表达式的意思。
这个表达式的意思是将maximum的值(字节为单位)转换为GB(Gigabytes)。1024字节(bytes)是1KB(Kilobytes),1024KB是1MB(Megabytes),1024MB是1GB。所以 maximum / 1024 / 1024 / 1024 就是将maximum从字节单位转换成GB单位。这里 * 1.0 的作用是确保结果是浮点数,因为如果两个整数做除法,结果也会是整数,有可能丢失精度。
关于你的第二个问题,这段代码的目的是尝试不断分配内存,直到无法再分配为止,然后记录并打印出能够分配的最大内存大小。由于这个过程中,它尝试申请并释放内存,这可能导致你的程序运行缓慢,并使你的电脑的资源使用率上升。
如果你的程序运行时间过长,那可能是因为你的电脑的内存非常大,以至于代码需要很长的时间才能找到无法分配内存的上限。此外,频繁的内存申请和释放也会消耗CPU资源,这可能是导致你电脑管家的加速球突然上升的原因。
关于解决办法,你可能需要考虑一下是否有必要运行这段代码。这段代码主要用来测试你的电脑能分配的最大内存,但在实际编程中,我们通常不会试图分配电脑所有的内存。如果你确定需要运行这段代码,那么请确保你的电脑有足够的内存和CPU资源,并做好可能会花费一段时间的准备。你也可以考虑修改代码,比如减小尝试分配内存的次数,或者增大每次尝试分配内存的大小,以此来减少总的运行时间。 isdkz 发表于 2023-6-6 09:18
首先回答你的第一个问题,关于 maximum * 1.0 / 1024 / 1024 / 1024 这个表达式的意思。
这个表达式的意 ...
例如呢,怎样修改代码,减小尝试分配内存的次数,或者增大每次尝试分配内存的大小 houqing1999 发表于 2023-6-6 09:55
例如呢,怎样修改代码,减小尝试分配内存的次数,或者增大每次尝试分配内存的大小
在你的代码中,使用 blocksize[] = {1024 * 1024, 1024, 1} 来控制每次尝试分配内存的大小,你可以通过调整这个数组的值来修改每次尝试分配内存的大小。例如,你可以将这个数组改为 blocksize[] = {1024 * 1024 * 1024, 1024 * 1024, 1024} ,这样每次尝试分配的内存就从1MB变为1GB,从而减少尝试的次数。
同样,你可以调整每次循环中尝试分配内存的次数。在你的代码中,这个值是由 count 控制的, count 在每次循环中都加1。你可以改变 count++ 这行代码,例如改为 count += 100 ,这样每次循环的时候 count 就会增加100,也就是说每次循环会尝试分配更多的内存。
这是修改后的代码示例:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
void *block;
int i, count;
size_t maximum = 0;
size_t blocksize[] = {1024 * 1024 * 1024, 1024 * 1024, 1024};
for (i = 0; i < 3; i++)
{
for (count = 1; ; count += 100)
{
block = malloc(maximum + blocksize * count);
if (block)
{
maximum += blocksize * count;
free(block);
}
else
{
break;
}
}
}
printf("malloc在当前环境下申请到的最大空间是:%.2fGB\n", maximum * 1.0 / 1024 / 1024 / 1024);
return 0;
}
请注意,这种方法可能会导致计算的最大内存值不太准确,因为它尝试分配的内存大小变大了,但如果你的目的只是为了得到一个大概的值,那么这种方法应该就足够了。同时,这样修改可以减少程序的运行时间和系统资源的使用。 isdkz 发表于 2023-6-6 09:57
在你的代码中,使用 blocksize[] = {1024 * 1024, 1024, 1} 来控制每次尝试分配内存的大小,你可以通过调 ...
俺爱了{:10_340:} 支持
页:
[1]