昨晚整理资料,翻出一个自己一年前写的txt,估计是当时自己闲得蛋疼的时候研究的玩意,只记录了实验数据和结论。实验就懒得重现了,只把结果在这记一下吧,供参考。

1、返回类型为结构体
结论:
1、调用函数前,先给返回的结构体预留空间,并把首地址压栈;
2、函数内部利用压栈的首地址设置返回的结构体信息;
3、函数返回值(eax)为压栈的首地址;
4、调用者把返回值(eax)指向的空间存放的结构体拷贝到栈上层的一段空间中;//第一次copy
5、调用者利用栈上层的这段空间存放的结构体信息给变量赋值。//第二次copy

2、形参类型为结构体
结论:
结构体为参数时,仿照压栈的方式,在栈上拉出结构体大小的空间并填充,作为函数参数(相当于将结构体压栈)。

» 转载请注明来源及链接:未来代码研究所

Related Posts:

2 Responses to “有关结构体作为函数参数和返回值的研究(VC++2008编译器)”

  • wwwyhx says:

    最撮的实现是这个样子的。编译器在parse源代码的时候就给函数的变量表里预设了这个结构题变量。

    但是如果打开优化,是介个样子的话:
    struct x = ReturnStruct(…)
    我记得好像就是在ReturnStruct函数体内直接操作x, who knows :)

  • 暗影吉他手 says:

    @wwwyhx
    这里给出的结果是debug模式的结果,没有优化,所以多了一次内存拷贝。如果release模式的话应该就是直接操作结构体所在的内存了,不会有多余的copy……应该是这样吧~

Leave a Reply

World Line
Time Machine
Online Tools