sumtec

sumtec 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑

曾经话痨,现在话痨,未来还是话痨。已经肉身翻墙,所以空气好再也不用带口罩了哈哈哈哈!

个人动态

sumtec 回答了问题 · 2016-03-30

解决关于泛型与多态的问题

楼上两位都不懂C#。

  1. C#在存class对象的时候也是指针,如果是ArrayList这种非泛型,或者List<Object>这种指定Object的泛型,存进去的struct/primitive(合称value type)数据,也是boxing之后得到一个地址然后存这个地址到集合里面;

  2. Java没区别是因为类型擦除,C#里面List<class type>是没有这个boxing/unboxing的事情的。

  3. cat、dog如果能派生自animal,就说明那不是struct。class对象在内存layout里面是包含了一个sync block和一个RTTI(就是具体类型的描述符),见此处。根据这个RTTI就可以判断具体类型,这个跟boxing/unboxing没半毛钱关系。class对象是不需要boxing和unboxing的。

  4. value type之所以必须boxing/unboxing,是因为他的语义是:a.作为一个整体直接layout到当前位置,比如一个struct局部变量就是直接躺在栈上的,如果是class里面的一个field则直接躺到这个class对象所占的内存,而不是另外从别的地方分一片内存然后用个指针指向它(这种是class);以及b. 因此每次赋值都必须拷贝,而不是用个指针一指了事。正因为他是直接躺的,对于ArrayList这种无泛型的系统,如果允许各种不同大小的struct躺在ArrayList里面,那么元素大小就不等长,arrayList[i]就不能通过offset + i * elemSize计算获得,只能挨个元素遍历。这就变成了查找第N个元素的时间复杂度为O(N)的LinkedList,而不是O(1)的ArrayList了,显然是不符合你的预期的,并且实现代码会变得很艰难也很奇怪。

  5. 这种东西其实你不需要问,网上很多现成的答案,当然你得翻墙。自己google:dotnet memory layout,甚至最好自己看ECMA Spec,然后用Windbg然后!loadby sos clr自己看。

  6. 已经帮你贴了这么多链接了,继续伸手党就得剁手了。

关注 6 回答 4

认证与成就

  • 获得 0 次点赞
  • 获得 0 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 0 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2016-03-30
个人主页被 70 人浏览