首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c/c++按指针传递参数/按引用传递参数堆栈框架布局

c/c++按指针传递参数/按引用传递参数堆栈框架布局
EN

Stack Overflow用户
提问于 2010-01-08 21:23:39
回答 4查看 612关注 0票数 2

编译器会为这两个语句生成相同的代码吗?

代码语言:javascript
复制
foo1(int* val){(*val)++;}

foo2(int &val){val++;}

它会简单地将一个指针写入foo的栈帧的参数部分吗?或者,在第二种情况下,调用者和foos的栈帧是否会以某种方式重叠,使得调用者的局部变量在堆栈上占用与foo的参数相同的内存?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-08 21:34:16

堆栈不能重叠。

考虑到参数可以是全局的、堆对象,或者即使存储在堆栈中,它也可能不是最后一个元素。根据调用约定,可能会将其他元素放在一个堆栈帧和传递给函数的参数(即返回地址)之间。

请注意,即使堆栈中没有添加任何内容,也不能在编译函数时做出决定,而是在编译器处理调用函数时做出决定。一旦编译了函数,它将不会根据调用它的位置而改变。

票数 0
EN

Stack Overflow用户

发布于 2010-01-08 21:25:22

这两个调用应该生成完全相同的代码,除非你有某种奇怪的编译器。

票数 4
EN

Stack Overflow用户

发布于 2010-01-08 22:12:16

那得看情况。

如果编译到库中,在大多数平台上生成的代码即使不完全相同,也是相同的。

任何好的编译器都会内联这样一个小函数,所以很有可能的是,它不会获得堆栈上某个东西的地址来递增指向的值,而是直接递增该值。任何内联函数的堆栈框架都嵌入到调用者的堆栈框架中,因此在这种情况下会重叠。

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

https://stackoverflow.com/questions/2027790

复制
相关文章

相似问题

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