32位编译器如何传递64位参数

之前我们了解到,无论我们传递参数是1字节2字节,最后编译器都会默认4字节的给我们传送,当我们用到的是8字节的那么是怎么返回的呢?

__int64 占用8字节空间

C语言:
32位编译器如何传递64位参数
我们下断点调试一下看看汇编代码:
32位编译器如何传递64位参数

在Function函数中我们看到,返回x值时,他会把8字节的值拆分成4字节和4字节,分别放入了eax和edx中。。。

我们看看eax的值:
32位编译器如何传递64位参数
edx:
32位编译器如何传递64位参数
而主函数中接收也是按照4字节4字节的形式接收
汇编:
32位编译器如何传递64位参数

我们来了解一下在Function函数中创建一个char型的数组,他是怎么分配的呢:
C语言:
32位编译器如何传递64位参数

我们看一下汇编:
32位编译器如何传递64位参数
它开辟了0x44这个堆栈大小的空间
这时我们在看看int类型的:
C语言:
32位编译器如何传递64位参数
在汇编中所开辟的空间:
32位编译器如何传递64位参数
我们会看到它开辟了0x50大小的堆栈的空间(如果我们在函数中什么都不做,那么默认开辟的空间大小为0x40,目前开辟的大小为0x50,我们定义的int i[4],我们了解到在vc中int占4个字节的空间,而目前的所开辟的空间为0x50,多出了0x10个空间,而多出来的空间是十六进制的,我们转换成十进制正好是16,也就是4个4字节的整型空间)

这里大家会想,为什么char数组是0x44而int是0x50呢?这里引出一个本质问题;

本质:对于本机来说只有它跟本机的宽度一致时,他的运行效率才最高

(因为char占1个字节,而我们创建了4个char型的数组,而本机是32位的,也就是4字节,因此当我们创建4个char类型的数据,他直接就跟本机宽度一致了,如果我们创建的char型数组为3个,那么他也会按照4个字节方式创建)

桶排序算法:
32位编译器如何传递64位参数

相关文章: