鱼C论坛

 找回密码
 立即注册
查看: 836|回复: 5

[已解决]s1e37动动手

[复制链接]
发表于 2023-6-6 09:09:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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[i] * count);
                        if (block)
                        {
                                maximum += blocksize[i] * count;
                                free(block);
                        }
                        else
                        {
                                break;
                        }
                }
        }

        printf("malloc在当前环境下申请到的最大空间是:%.2fGB\n", maximum * 1.0 / 1024 / 1024 / 1024);

        return 0;
}
最佳答案
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资源,并做好可能会花费一段时间的准备。你也可以考虑修改代码,比如减小尝试分配内存的次数,或者增大每次尝试分配内存的大小,以此来减少总的运行时间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-6 09:18:42 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +5 鱼币

首先回答你的第一个问题,关于 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资源,并做好可能会花费一段时间的准备。你也可以考虑修改代码,比如减小尝试分配内存的次数,或者增大每次尝试分配内存的大小,以此来减少总的运行时间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-6 09:55:26 | 显示全部楼层
isdkz 发表于 2023-6-6 09:18
首先回答你的第一个问题,关于 maximum * 1.0 / 1024 / 1024 / 1024 这个表达式的意思。

这个表达式的意 ...

例如呢,怎样修改代码,减小尝试分配内存的次数,或者增大每次尝试分配内存的大小
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[i] * count);
            if (block)
            {
                maximum += blocksize[i] * count;
                free(block);
            }
            else
            {
                break;
            }
        }
    }

    printf("malloc在当前环境下申请到的最大空间是:%.2fGB\n", maximum * 1.0 / 1024 / 1024 / 1024);

    return 0;
}

请注意,这种方法可能会导致计算的最大内存值不太准确,因为它尝试分配的内存大小变大了,但如果你的目的只是为了得到一个大概的值,那么这种方法应该就足够了。同时,这样修改可以减少程序的运行时间和系统资源的使用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

俺爱了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-6 17:39:52 | 显示全部楼层

回帖奖励 +5 鱼币

支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 13:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表