一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 1503|回复: 17
收起左侧

PureStorage的C++继承代码电面

[复制链接] |试试Instant~ |关注本帖
372284362 发表于 2015-10-21 13:54:50 | 显示全部楼层 |阅读模式

2016(7-9月) 码农类 硕士 实习@PureStorage - 内推 - 技术电面 |Other其他

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
        约的下午一点的电话面试,一点零一的时候电话准时来了。之前purestorage给了我一份代码,主要就是C++的继承、虚函数之类的东西,说让我研究研究,到时候电话面试讨论。
       面试官先确认我确实收到了这份代码,然后开始正式面试。首先问问我对C++了解到什么程度。我说基本就是course project的水平吧,OOP相关的东西也没做过什么。接着让我讲讲什么是虚函数、虚函数的作用、给我的代码输出是什么,这都是小打小闹。
       第一个正经的问题是虚函数的实现,也就是解释下什么是虚表。接着问了一个类的mem layout。我回答的不准确的问题是,为什么一定要用一个虚指针指向一个虚表,而不直接把虚函数的函数指针放到一个类的内存里。最开始我的回答是如果只用一个虚指针的话,各种不同的基类的mem layout显得看起来比较统一了。他提示我了一下考虑一种声明了1000个相同的基类的情况,我反应上来了,这样用虚指针可以节省内存。
       然后他让我描述了一个继承类的mem layout,我回答是对的,说最开始是基类的虚指针、基类的成员变量、继承类自己的虚指针、最后是虚函数自己的成员变量。他紧接着问为什么不先把所有的虚指针放在一起,然后把所有的成员变量放在一起?我说原来那样感觉看起来编译的时候比较自然。不过他让我再想个有点儿说服力的理由,我实在创造不出来,只能靠他讲解了。比如基类指针可以指向继承类实体,这是因为在casting的过程中,继承类的mem layout有那么一段和这个基类的是一样的。行吧,这个我真不知道。
       有两段代码,至此第一段代码就研究完了。第二段代码也是关于继承的,只不过这次继承类是从两个基类继承过来的。同样,先描述mem layout,我说是顺序依次是第一个基类的虚指针、成员变量、第二个基类的虚指针、成员变量、自己的虚指针和成员变量。问的问题是我们能不能只在他的mem layout里放两个虚指针。我的想法是一个虚指针指向自己的虚表,另一个虚指针指向一个虚指针表,在虚指针表里存所有的基类虚指针。他说这是个interesting idea,但是又跟我说了另一种方案。他的意思是把继承类的虚函数指针放在每个基类的虚表里。如果是按照这个第二份代码,一个继承类继承两个基类,同时只有一个属于继承类的虚函数的话,他说的方法确实比较节省内存。不过比如继承类有太多自己的虚函数的话,我觉得我的方法比较省内存啊。不知道这两个方法还能从哪个方面比较。
       总得来说,我觉得这次面试比较虚。主要缺失除了算法之外,自己也不会什么。这种关于balabala的原理实现之类的,之前了解的也不多。
. more info on 1point3acres.com

评分

1

查看全部评分

mp7223157 发表于 2016-3-25 09:33:20 | 显示全部楼层
借个楼问一下,如果完全不会C++,还会给这道题么?有没有相似经历的同学。。
回复 支持 1 反对 0

使用道具 举报

cherylshang 发表于 2015-10-21 21:54:00 | 显示全部楼层
LZ是海投的么? 什么时候投的啊
回复 支持 反对

使用道具 举报

 楼主| 372284362 发表于 2015-10-22 02:06:21 | 显示全部楼层
cherylshang 发表于 2015-10-21 21:54
LZ是海投的么? 什么时候投的啊

我是找人内推的。。。
回复 支持 反对

使用道具 举报

sparksfly 发表于 2015-10-26 02:00:43 | 显示全部楼层
372284362 发表于 2015-10-22 02:06. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
我是找人内推的。。。
. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
楼主,我明天就店面了,有一个事情想请教你,那个类的 layout 具体是什么,比如base1的layout就是
1,base1的virtual function
2,  base1的那个变量data1吗?
还有如果是derived的layout是不是
1.base1的virtual function
2.base1的变量data1
3.derived的virtual function
4.derived的变量deriveddata

是不是这么回答的
但是根据我的理解,在虚函数表中,后代因为重新定义了虚函数,不是应该在后代的layout中覆盖base的virtual function吗?请解答一下好吗
回复 支持 反对

使用道具 举报

 楼主| 372284362 发表于 2015-10-26 05:12:48 | 显示全部楼层
sparksfly 发表于 2015-10-26 02:00
楼主,我明天就店面了,有一个事情想请教你,那个类的 layout 具体是什么,比如base1的layout就是
1,ba ...

我也一两句话说不太明白。。。推荐你看看这个:

http://www.learncpp.com/cpp-tutorial/125-the-virtual-table/. 1point 3acres 璁哄潧

你mem layout里面不应该说是base 1 的virtual func和derived的virtual func,是virtual pt,然后再说vitrual pt指向的vtable里面的layout
回复 支持 反对

使用道具 举报

fredlumm 发表于 2015-11-6 09:54:23 | 显示全部楼层
感觉mem layout是不是有点问题, 单继承(非multiple inheritance)的话应该只有一个vpointer吧, 为什么会先出现基类的vpointer再出现继承类的vpointer?求问?
回复 支持 反对

使用道具 举报

 楼主| 372284362 发表于 2015-11-6 09:57:44 | 显示全部楼层
fredlumm 发表于 2015-11-6 09:54
感觉mem layout是不是有点问题, 单继承(非multiple inheritance)的话应该只有一个vpointer吧, 为什么会 ...
. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
我觉得是如果所有的虚函数都是继承来的就一个vpointer,如果自己的不是继承下来的,就还要有自己的vpointer。。。
回复 支持 反对

使用道具 举报

fredlumm 发表于 2015-11-6 11:09:51 | 显示全部楼层
372284362 发表于 2015-11-6 09:57
我觉得是如果所有的虚函数都是继承来的就一个vpointer,如果自己的不是继承下来的,就还要有自己的vpoint ...

楼主你确定么。。。。。如果需要调用基类的function,直接初始化一个基类不就好了。。。继承类vpointer指的vtable难道不是他所继承的,也包括他override的?
回复 支持 反对

使用道具 举报

blactangeri 发表于 2015-11-6 11:51:30 | 显示全部楼层
For any class, there's only one vtbl that contains the addresses of its virtual functions, both inherited and self-defined. Waral 鍗氬鏈夋洿澶氭枃绔,

鏉ユ簮涓浜.涓夊垎鍦拌鍧.


补充内容 (2015-11-6 12:14):
in general an object of a derived class needs a vtbl for each base class plus one for the derived class. However, as with single inheritance, a derived class can share a vtbl with its first base
回复 支持 反对

使用道具 举报

blactangeri 发表于 2015-11-6 13:01:46 | 显示全部楼层
请问lz
“为什么一定要用一个虚指针指向一个虚表,而不直接把虚函数的函数指针放到一个类的内存里”
这里是怎么节省内存的
回复 支持 反对

使用道具 举报

 楼主| 372284362 发表于 2015-11-6 17:20:11 | 显示全部楼层
blactangeri 发表于 2015-11-6 11:51
For any class, there's only one vtbl that contains the addresses of its virtual functions, both inhe ...

学到了!
回复 支持 反对

使用道具 举报

 楼主| 372284362 发表于 2015-11-6 17:21:58 | 显示全部楼层
blactangeri 发表于 2015-11-6 13:01
请问lz
“为什么一定要用一个虚指针指向一个虚表,而不直接把虚函数的函数指针放到一个类的内存里”
这 ...

比如说一个类有1000个虚函数,我们有1000个这样的类:

如果直接放到layout里,就会占用1000*1000的空间

如果把一个虚指针放到layout里,所有的虚指针指向同一个虚表,占用空间是1000+1000
回复 支持 反对

使用道具 举报

blactangeri 发表于 2015-11-6 22:43:04 | 显示全部楼层
372284362 发表于 2015-11-6 17:21 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
比如说一个类有1000个虚函数,我们有1000个这样的类:

如果直接放到layout里,就会占用1000*1000的空 ...
. 鍥磋鎴戜滑@1point 3 acres
谢谢回复. From 1point 3acres bbs
你的有意思应该是说“我们有1000个这样的类的对象”是不是. From 1point 3acres bbs
因为类的所有对象共享同一个vtbl
回复 支持 反对

使用道具 举报

theugly 发表于 2015-11-6 23:31:52 | 显示全部楼层
一直以为purestorage比较高大上,果然题目不凡。
回复 支持 反对

使用道具 举报

M要忘了Dean 发表于 2015-11-19 02:41:38 | 显示全部楼层
给楼主点个👍!谢谢楼主分享
回复 支持 反对

使用道具 举报

lfzh123 发表于 2016-4-20 12:20:30 | 显示全部楼层
对啊,我下周电面,但是C++真的不熟啊,刷题都是用java,对于C++ virtual function/mem layout这些概念都不熟,该怎么办呢?
回复 支持 反对

使用道具 举报

Urumic 发表于 2016-6-4 06:22:15 | 显示全部楼层
楼主,我觉得如果只有一个基类的话,应该只有一个指向虚表的指针在对象里。
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-6 20:41

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表