0

是否有符合标准的方法来检测 C 标准库中的函数是否通过内部/内置实现?

如果仅仅是因为函数调用开销,我很有信心我可以实现比标准库为特定调用站点提供的函数更好的代码。但是如果有问题的函数是通过内在/内置实现的,则没有函数调用开销可以击败,因此尝试将是愚蠢的。

如果有办法,我觉得这并不简单,因为它可能因呼叫站点而异。例如,传递一个恒定长度的 tomemcpy可以为编译器提供一个生成内联代码的好机会,但一个可变长度可能提供一个较小的机会。我想最好的提示可能是三个值之一,“总是”、“从不”或“有时”。这对我来说已经足够了。

只要符合标准,如何实现这一点的细节是可以协商的。该标准的版本甚至是可以协商的,因为这是可测试的,如果该问题对于该标准的早期版本无法回答,我很乐意做出最安全的假设。但当然,在编译时执行此操作的方法将是首选。

(经过编辑以包含具体细节,以便更容易思考,即使这些细节无关紧要)

让我们假设memcpy确实是有问题的函数,并且我们知道长度始终是可变的,因为它被传递给调用 的函数memcpy,但我们也知道长度通常为 1。

调用库的开销肯定会支配if (1==length)*dst = *src;。所以问题是 1 实际值的频率是多少,这是一个只有我能回答的问题,以及是否可以消除实现调用库的任何可能性。

memcpy这个问题不是关于是否可以编写比任何其他标准库函数更快的函数。对此有很多问题,而这不是其中之一。

4

1 回答 1

0

似乎我们最接近简单的是或否的答案是 Nate Eldredge 的评论:“C 标准甚至没有'内在/内置'的概念”。

于 2022-02-11T05:02:49.047 回答