影响很深的32位机的概念-c语言返还结构体

  前一段公司考试了c语言考试,由于自己今年年初刚去维护VC开发的模块,由于自己以前,也对c语言的学习,从来没有间断过,也就很乐意地去参加了这次考试。

 

  经过考试,勉强考试过关,里面出的考题里面,也激起了自己对一些c语言根本性问题的追究,也就很是“第一次”地利用vc里面自带的"go to disassembly"工具,查看c语言代码之后的汇编代码是什么样子,也逐个验证了c语言考试中的一些疑惑问题。

  在验证的过程,自己感触最深的震撼就是32Bits计算机环境,在32Bits计算机环境中,最大的读取单位是32Bits、最大的写入单位32Bits,最大能够携带的信息量也是32Bits,都被限制在32Bits这样的一个框架里面,一点都不能突破!!

 

    当时就想到,在c语言里面实际上支持return 一个结构体的,为什么c语言能够做到返还一个结构体呢?自己连续声明了三个结构体,结构体里面从一个元素、两个元素、到多个元素,从return struct的指令翻译出来的汇编代码来看,c语言返还一个struct实际上也被限制在32Bits的框架里面,没有任何突破,也更触动了自己对32Bits的特殊理解。

 

  在c语言返还一个结构体的时间,也是按照32Bits信息一个一个返还,特别在结构体元素比较少的时间体现的更明显,例证:

#retStruct2()简单结构体返还值,只有两个属性retStruct2的结尾处理
0040271A   mov         eax,dword ptr [ebp-10h]
0040271D   mov         edx,dword ptr [ebp-0Ch]

#函数返还值赋值给外面结构体
381:          k = retStruct2();
00405E24   call        @ILT+310(retStruct2) (0040113b)
00405E29   mov         dword ptr [ebp-528h],eax  #获取寄存器中返还的第一个32Bits值
00405E2F   mov         dword ptr [ebp-524h],edx  #获取寄存器中返还的第二个32Bits值

00405E35   mov         edx,dword ptr [ebp-528h]
00405E3B   mov         dword ptr [k],edx                #给k.i赋值,由编译器自己扩展

00405E41   mov         eax,dword ptr [ebp-524h]
00405E47   mov         dword ptr [ebp-49Ch],eax  #给k.j赋值,由编译器自己扩展

 

 

  对于c语言能够返还结构体研究后,就有另一个疑问c语言为什么不能返还一个数组类型出去?我们从c语言返还结构体的汇编代码可以看出来,c语言返还结构体,只是由return 一个最大32Bits信息量的最原子的返还,由一定的“算法”步骤,由编译器组合出来一个return结构体的过程!如果c语言编译器能够按照一定算法步骤return一个struct的话,那么返还一个数组,只是其一个子问题!

 

 对于此,我很是迷惑,就问了一个大侠,大侠的解释是c语言当时没有考虑此种情况!我想即使是没有考虑,那些大师们也应该有不考虑的理由的;遂就不相信地,问了另外一个大侠,那个大侠回答的,我认为可能更接近于真实,即c语言return一个数组,而不是通过指针形式返还,可能造成不必要的性能损失,遂语言就禁止类此种语言特性!

 

 关于c语言返还数组可能会造成性能损失,可以从c语言返还含有多个域的struct的汇编看的出来,里面确实包含了多个rep movs    dword ptr [edi],dword ptr [esi]  #以dword赋值多次  汇编指令,在多个地址空间中倒腾过来、倒腾过去

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值