编译器会为这两个语句生成相同的代码吗?
foo1(int* val){(*val)++;}
foo2(int &val){val++;}它会简单地将一个指针写入foo的栈帧的参数部分吗?或者,在第二种情况下,调用者和foos的栈帧是否会以某种方式重叠,使得调用者的局部变量在堆栈上占用与foo的参数相同的内存?
发布于 2010-01-08 21:34:16
堆栈不能重叠。
考虑到参数可以是全局的、堆对象,或者即使存储在堆栈中,它也可能不是最后一个元素。根据调用约定,可能会将其他元素放在一个堆栈帧和传递给函数的参数(即返回地址)之间。
请注意,即使堆栈中没有添加任何内容,也不能在编译函数时做出决定,而是在编译器处理调用函数时做出决定。一旦编译了函数,它将不会根据调用它的位置而改变。
发布于 2010-01-08 21:25:22
这两个调用应该生成完全相同的代码,除非你有某种奇怪的编译器。
发布于 2010-01-08 22:12:16
那得看情况。
如果编译到库中,在大多数平台上生成的代码即使不完全相同,也是相同的。
任何好的编译器都会内联这样一个小函数,所以很有可能的是,它不会获得堆栈上某个东西的地址来递增指向的值,而是直接递增该值。任何内联函数的堆栈框架都嵌入到调用者的堆栈框架中,因此在这种情况下会重叠。
https://stackoverflow.com/questions/2027790
复制相似问题