houqing1999 发表于 2023-6-6 09:09:04

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;
}

isdkz 发表于 2023-6-6 09:18:42

首先回答你的第一个问题,关于 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资源,并做好可能会花费一段时间的准备。你也可以考虑修改代码,比如减小尝试分配内存的次数,或者增大每次尝试分配内存的大小,以此来减少总的运行时间。

houqing1999 发表于 2023-6-6 09:55:26

isdkz 发表于 2023-6-6 09:18
首先回答你的第一个问题,关于 maximum * 1.0 / 1024 / 1024 / 1024 这个表达式的意思。

这个表达式的意 ...

例如呢,怎样修改代码,减小尝试分配内存的次数,或者增大每次尝试分配内存的大小

isdkz 发表于 2023-6-6 09:57:41

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;
}


请注意,这种方法可能会导致计算的最大内存值不太准确,因为它尝试分配的内存大小变大了,但如果你的目的只是为了得到一个大概的值,那么这种方法应该就足够了。同时,这样修改可以减少程序的运行时间和系统资源的使用。

houqing1999 发表于 2023-6-6 09:59:54

isdkz 发表于 2023-6-6 09:57
在你的代码中,使用 blocksize[] = {1024 * 1024, 1024, 1} 来控制每次尝试分配内存的大小,你可以通过调 ...

俺爱了{:10_340:}

sfqxx 发表于 2023-6-6 17:39:52

支持
页: [1]
查看完整版本: s1e37动动手