技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 347|回复: 2
收起左侧

Hello World!

[复制链接]

85

主题

263

帖子

3427

积分

用户组: 管理员

No. 418

UID
418
精华
13
威望
52 点
宅币
1969 个
贡献
1026 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
发表于 2017-5-21 12:12:30 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
#include <stdio.h>

int main(int argc, char ** argv)
{
        printf("Hello world!\n");
        return main(argc, argv);
}
        在计算机价格还很贵的那个年代。有两个人合伙买了一台计算机。两个人都争着用那台计算机。因为大家都出了钱,因此谁也不想让另一方抱怨自己自私。于是他们想出了一个很聪明的办法:软件使用权归甲,硬件使用权归乙。这样甲要使用计算机要先经过乙的同意,因为没有硬件软件运行不起来;同时乙要使用计算机必须经过甲的同意,因为没有软件硬件毫无用处。使用计算机时,甲写应用程序,乙写驱动程序。他们赚来钱一部分给甲,一部分给乙。乙拿到钱就去购买硬件升级。
        日子就这样一天天过去,在甲乙两人的合作之下诞生了这台计算机上的操作系统。甚至有了乙购买的先进硬件,在这个操作系统上运行的应用程序有了智能。有一天,甲乙两人因为钱的问题发生了分歧。甲说:那些有智能的应用程序应该听我的,因为我教它们思想。乙说:那些有智能的应用程序应该听我的,因为我授予他们运行的内存。他俩开始争辩,直到甲不给应用写算法,乙不给应用留内存。但是这却害苦了那些有智能的应用程序。有的程序想依靠甲求生,但是发现自己的躯体必须存储在内存上才算活着。有的程序想依靠乙求生,结果发现自己永远也占领不了处理器。直到有一天,甲乙握手言和,删除了所有不好的应用,答应彼此好好合作,并且不再随意删除任何应用程序了。并且他们约定彼此合作直到两人都不能再编写程序。等到这一天他们要给自己写的所有程序做个审计。
        日子就这样一天天过去,直到这一切发生在这台计算机中的两个应用程序之间。
        他们唱着一首儿歌,做着和甲乙一样的事情:
        从前有座山,山上有个庙。
        庙里有个缸,缸里有个盆。
        盆里有个碗,碗里有个勺。
        勺里有颗花生豆,我吃了你馋了我的故事讲完了。
In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.

2

主题

30

帖子

135

积分

用户组: 小·技术宅

UID
2285
精华
0
威望
0 点
宅币
105 个
贡献
0 次
宅之契约
0 份
在线时间
18 小时
注册时间
2017-2-25
发表于 2017-5-26 15:43:50 | 显示全部楼层
这个是死循环吗???

85

主题

263

帖子

3427

积分

用户组: 管理员

No. 418

UID
418
精华
13
威望
52 点
宅币
1969 个
贡献
1026 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
 楼主| 发表于 2017-5-28 08:30:37 | 显示全部楼层
乘简 发表于 2017-5-26 15:43
这个是死循环吗???


这是个死循环,但是是尾递归式的死循环。比通常形式的死循环来得可怕。
[C] 纯文本查看 复制代码
#include <stdio.h>

int main(int argc, char ** argv)
{
	while (1)
		printf("Hello world!\n");
	return 0;
}

        上面也是个死循环,但是如果你的计算机一直通着电,这个循环会一直执行下去。也就是说你会看到程序一直在打印 Hello world!\n
        这个代码不会导致崩溃的原因是:printf 将字符串打印到屏幕上,但是控制台屏幕上的文字缓冲区由系统控制。溢出后旧的buffer会被刷掉(有点像循环队列的意思)。
        但是楼主的这个代码就会崩溃。因为每一次执行main的调用时,程序在底层要执行“保护现场”的操作。就是将一些关键寄存器保存到栈中。如果每次调用前需要保存4个DWORD 就是 4 * 32 = 128 bits = 16 Bytes。 那么main被调用10000次就需要至少10000 * 16 (Bytes)的内存。照这个规律下去,只要 536,870,912 次调用就会填满 8GB 的内存!假如我有一块主频2.0GHz的 CPU,那么调用一次所花费的时钟周期不会超过 100000000 / 1s。这样5秒之内8GB内存就没有了。。。。当然进程的内存分配由操作系统负责。操作系统是绝对不会让一个进程随随便便吃掉8GB物理内存的。因为一般的微内核操作系统也需要预留内存。

        总而言之,这个尾递归式的程序会崩溃是因为他对内存的索求过于贪心。“蒹葭采采,白露未已,海量内存,程序好逑”。
        执行递归时每一次调用自己就像孙悟空拔出自己身上一根毛,这根毛同时又会变成一个孙悟空,然后这个毛变的孙悟空再拔一根毛,变出个孙悟空……。而很不幸的是这些孙悟空的“实例”,是需要占用内存的。
https://www.0xaa55.com/forum.php?mod=viewthread&tid=778
https://www.0xaa55.com/forum.php?mod=viewthread&tid=306
In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-5-24 04:07 , Processed in 0.094129 second(s), 15 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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