首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >K&R练习题对原问题的回答

K&R练习题对原问题的回答
EN

Stack Overflow用户
提问于 2010-11-04 06:21:45
回答 1查看 155关注 0票数 2

我一直努力想办法解决7-8的K&R问题,直到我在这个网站上找到了this solution (with the original problem)。我无法对这个答案发表评论(可能是因为它的年龄);我能在这个问题上得到实际投入的唯一方法就是贴出一个答案,我觉得这是不恰当的。因此,我决定根据所选的“答案”创建这个与此密切相关的问题,这在我看来是合乎逻辑的,直到我谈到这个问题(关于作为宏实现一个函数):

“将其作为宏经常重复,并且由于比特掩蔽有固定的大小,节省空间很快就成为一种成本。”

唯一的问题是函数调用也需要时间。“跳转”到函数位置,为局部变量留出存储空间,然后实际计算比较,所有这些都需要时间。

那么,如何实现一个宏,该宏测试字符的ASCII值要比包含表查找的第一个函数慢(考虑到这一点)?

一个函数调用比比较两个整数(其中一个已经在内存中,其中一个是常量)花费的时间更短是怎么可能的?在我看来,对函数和宏的反复调用,随着时间的推移,仍然会导致宏运行得更快。

我的思维方式不对吗?我想这肯定是因为它不是在最初的问题中提出来的。

如果有人能对此有所了解,我会很高兴的。

EN

回答 1

Stack Overflow用户

发布于 2010-11-04 07:00:12

首先,请注意他们提到的成本是大小,而不是速度。例如,让我们假设宏扩展到16字节的代码。让我们进一步假设函数编译成32字节的代码,调用函数需要6字节的代码(当然,这些代码都没有得到保证,但它们都可能至少在32位代码正确的大致范围内)。

在这种情况下,如果您使用一个函数,但只从一个地方调用它,您将得到38个字节的代码。如果使用宏,则只获得16字节的代码,节省了22字节。如果你在两个地方使用这个宏,你会得到32个字节的代码,而如果你使用了一个函数,则是44个字节--这仍然是一个节省,但更小的一个。让我们假设您是从代码中的10个不同位置使用它的。在这种情况下,宏将花费160个字节,但是函数只需要92个字节。

在现代处理器上,我还可以看到一个相当合理的论点,即函数也可以更快。大多数现代处理器都使用缓存。如果您使用的函数足够多,当您调用它时,它通常会在缓存中,这很可能比使用宏更快,在宏中,每次使用代码时,您都可能(更多)不得不再次从内存中获取代码。原因很简单:现代处理器的运行速度比内存快得多。

即使在最好的情况下,您也可以计划至少50 ns的延迟来从内存中获取一些数据( 75-100 ns是相当常见的)。作为平均值,让我们假设75 ns。一个典型的现代CPU每个时钟执行大约1.8个指令,在(例如) 2.5 GHz时,时钟周期时间为.4 ns。这意味着在75 ns中,它可以(平均)执行类似于75/0.4*1.8 = 337.5的指令。调用、执行和从我们在这里讨论的函数返回的地方大约有六条指令--所以在一个很紧的循环中,当您从内存中获取宏的代码时,当您可以在缓存中执行函数时,大约要执行56次。

当然,如果您只在一个紧循环中执行该操作,则大多数情况下宏也会在缓存中。当您从代码中的足够不同的位置调用该函数时,这个函数的优点就会发生,即使在循环的第一次迭代时,这个函数通常也在缓存中,这通常不是宏的情况。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4094336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档