assembly - 位置参数与关键字参数

标签 assembly compiler-construction execution

这是我的老师在考试中提出的问题。我也在书中和网上搜索过,但我没有找到答案。我知道问题的第一部分。问题是关于编译器和汇编器的。

问题: 使用关键字参数比使用位置参数有什么优势?在组装过程中是否会产生任何开销?它在执行期间会产生任何开销吗?

最佳答案

回答您的问题:

  1. 有什么优势?

    主要优点是避免在错误的地方定义错误参数的问题。例如:

    strlen(s);
    

    只有一个参数,所以没有出错的风险。然而:

    strpos(s, "needle", 34);
    

    可能是错误的,因为例如,s"needle" 可能是颠倒的。使用命名参数:

    strpos(start_pos => 34, string => s, needle => "needle");
    

    你可以肯定的是,一旦编译成汇编,参数就会被正确放置(因为对于最终的汇编结果,这显然是非常重要的!)

  2. 组装过程中的开销?

    是的。显然,您需要读取额外的数据,并且您的编译器必须重新排序参数。这也意味着 header 必须用名称声明参数。在 C 中,你经常会看到这样的事情:

    strpos(const char *, const char *, int);
    

    现在您在声明中以及何时使用函数时有了名称。还有更多的标识符需要解析,可能还有内存需要分配等等。

    在现代计算机上,我们的肉眼是否可以看到这种开销?可能不是。

  3. 最终的二进制文件是否运行得更慢?

    没有。无论哪种方式,最终二进制文件中的结果都完全相同。只有一种方法比另一种方法安全得多。 (即,如果我们都被迫始终指定参数名称,那么可以避免许多错误......但是,PHP 或 python 等脚本运行速度会较慢,因为每次执行时都需要重新解析这些参数脚本。)

关于assembly - 位置参数与关键字参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23494203/

相关文章:

assembly - AT&T GAS 汇编中的数组寻址。 RIP 的寄存器偏移不起作用

assembly - 使用 CALL 读取 RIP 避免 shellcode 中的 0xFF 字节?

java - 绘制控制流图

compiler-construction - Lisp 如何既是动态的又是可编译的?

parsing - 构建 LR(1) 配置前瞻

c++ - 遵循代码流程

c++ - "Operation not permitted"尝试执行已编译的 C++

c - 从我们按下键盘上的一个键到它出现在你的word文档中会发生什么

c++ - 为什么编译器只为 int 保留 0x10 位?

c++ - C 执行期间记录错误