C中为什么参数以列表反序压入堆栈中
2012-03-13 14:35
190 查看
转自:《C和指针》中文版,p396
我们现在可以推断出为什么参数要按照列表反序压入到堆栈中。被调用函数使用帧指针加一个偏移量来访问参数。当参数以反序压入到堆栈时,参数列表的第一个参数便位于堆栈中这堆参数的顶部,它距离帧指针的偏移量是一个常数。事实上,任何一个参数距离帧指针的偏移量都是一个常熟,这和堆栈中压入多少个参数并无关系。
如果参数以相反的顺序压入到堆栈会怎样呢(即按照参数列表顺序)?这样一来,第一个参数距离帧指针的偏移量就和压入到堆栈中的参数数量有关。编译器可以计算出这个值,但还是存在一个问题 -- 实际传递的参数数量和函数期望接受的参数数量可能并不相同。在这种情况下,这个偏移量是不正确的
那么祝反序方案中,额外当参数时如何处理当呢?堆栈帧当图显示任何额外当参数都将位于前几个参数当下马,第一个参数距离帧指针的距离将保持不变。因此,函数可以正确地访问前三个参数,对于额外的参数可以简单地忽略。
附:
为什么C中实际传递的参数数量和函数期望接受的参数数量可以不相同:
因为C的方法签名中并不包含参数,即int foo(int a)和int foo(int a, int b)不能同时出现,这点和C++不一样的。
我们现在可以推断出为什么参数要按照列表反序压入到堆栈中。被调用函数使用帧指针加一个偏移量来访问参数。当参数以反序压入到堆栈时,参数列表的第一个参数便位于堆栈中这堆参数的顶部,它距离帧指针的偏移量是一个常数。事实上,任何一个参数距离帧指针的偏移量都是一个常熟,这和堆栈中压入多少个参数并无关系。
如果参数以相反的顺序压入到堆栈会怎样呢(即按照参数列表顺序)?这样一来,第一个参数距离帧指针的偏移量就和压入到堆栈中的参数数量有关。编译器可以计算出这个值,但还是存在一个问题 -- 实际传递的参数数量和函数期望接受的参数数量可能并不相同。在这种情况下,这个偏移量是不正确的
那么祝反序方案中,额外当参数时如何处理当呢?堆栈帧当图显示任何额外当参数都将位于前几个参数当下马,第一个参数距离帧指针的距离将保持不变。因此,函数可以正确地访问前三个参数,对于额外的参数可以简单地忽略。
附:
为什么C中实际传递的参数数量和函数期望接受的参数数量可以不相同:
因为C的方法签名中并不包含参数,即int foo(int a)和int foo(int a, int b)不能同时出现,这点和C++不一样的。
相关文章推荐
- C中为什么参数以列表反序压入堆栈中
- params 数组参数的解读 为什么:对于 params 只能在一个参数列表中使用一次 并且要放到最后
- Python——可变类型与不可变类型(即为什么函数默认参数要用元组而非列表)
- 终于明白为什么无参数函数名,以及函数指针定义时参数列表一定要写上(void)而不是空着了
- C语言中的可变参数-printf的实现原理 在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出
- 可变参数为什么要放参数列表最后?
- bash: /usr/bin/ls: 参数或环境列表太长
- JVM参数详细列表
- 第五章.初始化和清理 初始化可变参数列表
- C++中为什么构造函数初始化列表
- 汇编中的参数传递和堆栈平衡
- 通过参数列表向C语言传递参数
- 19 原 Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数
- Mybatis基于注解实现增删查改和多参数列表查询
- 参数列表中的self:显式不等于冗余
- 如何得到任意一个存储过程的参数列表的
- 为什么参数是对象时还要调用拷贝构造函数?
- C++关于类成员函数在参数列表后加const的作用,以及使用条件
- 为什么select使用时第一个参数要加1
- printf函数遵守C调用规范,即参数 从右至左 压栈,堆栈由调用者平衡