Golang和Rust的胖指针与C++的指针指向虚表哪种设计更好?

论坛 期权论坛 知乎     
知乎de用户   2019-8-18 00:57   16562   3
转载声明:本文由互联网用户自发贡献,部分转载来源来自知乎(zhihu.com),强烈建议您访问知乎查看完整内容。本社区不拥有所有权,也不承担任何法律责任。如有侵权,请联系optbbs@163.com。一经查实,即刻删除。
对运行时多态的实现主要是这两种实现, 本质就是元信息的指针是贴近指针还是贴近数据成员. 感觉两种设计各有利弊,期待高手具体分析.
分享到 :
0 人收藏

3 个回复

倒序浏览
2#
热心回应  16级独孤 | 2019-8-18 00:57:45 发帖IP地址来自
Rust 的设计还有重要缺陷,比如,多 trait object 怎么办?
Trait objects for multiple traits · Issue #2035 · rust-lang/rfcs

Fat/Thin pointer 很可能是在不同场景下各有优劣。早就有人想给 Rust 支持类似 C++ inheritance 的方案,让大家可以根据场景自己选择 fat/thin pointer。
Summary of efficient inheritance RFCshttps://internals.rust-lang.org/t/blog-post-extended-enums-and-thin-traits/2755nikomatsakis/fields-in-traits-rfc这事再往下深究,那就是能否由用户自定义胖指针的结构?有些胖指针的元数据是指向vtable的指针,有些胖指针的元数据是 usize,这些都是写死在编译器的,怎么样才能让用户自己扩展,自己决定胖指针里面的元数据?如果支持了类C++的内存布局,把vtable指针当成是给object加的额外的元数据,能不能让这个机制更泛化,可以让用户决定加更多的元数据呢?还有很多很多类似的尝试,我一时也找不全。
至于Rust和C++的比较,我是回答不上来的。但是至少Rust目前的设计还是不够的,还有很大改进空间。
3#
热心回应  16级独孤 | 2019-8-18 00:57:46 发帖IP地址来自
抛砖引玉一下:


各有优劣吧,看场景


C++:
优点:当你需要运行时多态时,一个指针就够了
缺点:不管你是否需要运行时多态,你的class内存布局里都会有一份或多份vptr


Rust:
优点:struct内存布局没有vptr,节省空间。只有当你真正需要使用Trait对象时,才会有vptr,you don't pay for what you don't use(看向C++
缺点:需要运行时多态时(Trait对象),每个对象你使用了两个指针


当你大量使用运行时多态时,或许C++在这一点上好一些,反之则是Rust。(其实差别应该也是很小的。而且一般也没得选,不会单因为这个原因去选择C++或者Rust)


个人比较喜欢Rust的方式


另外C++有个库貌似实现了rust的方式 ldionne/dyno
Rust的话或许也可以用C++的方式?我记得曾经Futures相关的LocalWaker里在struct里存了一个vptr
4#
热心回应  16级独孤 | 2019-8-18 00:57:47 发帖IP地址来自
还是有些不同的,比如C++可以从基类指针调用派生类方法(虚方法),但是Go的话虽然可以用匿名包含来类似继承,不过要多态就只能靠接口了,当然不是说谁好谁坏的问题
Go这种做法的好处是,如果不看方法不用多态,那么struct就仅是struct,空间比较可控,在值传递/赋值的设计下,struct赋值的时候规则比较简单(就是直接拷贝),缺点的话。。。正常使用的前提下好像也没太大缺点,印象比较深的坑就是一个struct的nil指针转interface,和一个nil值的interface是不同的
另一个区别是C++的对象要转接口类型只能是地址转接口指针,或者引用之间的互转,Go则支持struct值转interface,不过这好像是另一个设计区别了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:55334
帖子:27423
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP