这是我的老师在考试中提出的问题。我也在书中和网上搜索过,但我没有找到答案。我知道问题的第一部分。问题是关于编译器和汇编器的。
问题:
使用关键字参数比使用位置参数有什么优势?在组装过程中是否会产生任何开销?它在执行期间会产生任何开销吗?
最佳答案
回答您的问题:
有什么优势?
主要优点是避免在错误的地方定义错误参数的问题。例如:
strlen(s);
只有一个参数,所以没有出错的风险。然而:
strpos(s, "needle", 34);
可能是错误的,因为例如,
s
和"needle"
可能是颠倒的。使用命名参数:strpos(start_pos => 34, string => s, needle => "needle");
你可以肯定的是,一旦编译成汇编,参数就会被正确放置(因为对于最终的汇编结果,这显然是非常重要的!)
组装过程中的开销?
是的。显然,您需要读取额外的数据,并且您的编译器必须重新排序参数。这也意味着 header 必须用名称声明参数。在 C 中,你经常会看到这样的事情:
strpos(const char *, const char *, int);
现在您在声明中以及何时使用函数时有了名称。还有更多的标识符需要解析,可能还有内存需要分配等等。
在现代计算机上,我们的肉眼是否可以看到这种开销?可能不是。
最终的二进制文件是否运行得更慢?
没有。无论哪种方式,最终二进制文件中的结果都完全相同。只有一种方法比另一种方法安全得多。 (即,如果我们都被迫始终指定参数名称,那么可以避免许多错误......但是,PHP 或 python 等脚本运行速度会较慢,因为每次执行时都需要重新解析这些参数脚本。)
关于assembly - 位置参数与关键字参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23494203/