begeekmyfriend / bplustree

A minimal but extreme fast B+ tree indexing structure demo for billions of key-value storage
MIT License
1.86k stars 315 forks source link

请教一个问题bplus_tree_insert内部函数的实现 #7

Closed zjbbuaa0817 closed 6 years ago

zjbbuaa0817 commented 6 years ago

key(root)[0]= key这行代码如何理解呢

begeekmyfriend commented 6 years ago

参看宏定义,表明root节点key成员偏移处的第一个key地址

zjbbuaa0817 commented 6 years ago

这个bplus_node没有成员名字叫做key啊,恕我愚钝,实在没看懂。

begeekmyfriend commented 6 years ago

bplus_nodebplus_leafbplus_non_leaf的公共头部,整个bplus_leafbplus_non_leaf都是假定4KB大小的话,bplus_node是40Bytes大小(最新版本,按64位机sizeof的话),剩下4KB-40B就是key[]和entry[]数组,这些都是存储在数据库文件里的。你看看bplus_tree.h就知道了

zjbbuaa0817 commented 6 years ago

这种用法是C语言里的什么用法啊,我仔细看了你把bplus_leaf和bplus_non_leaf的结构体定义都屏蔽了啊,只是这两个结构体前面是公共部分的,编译器如何知道bplus_node有key成员的呢。

begeekmyfriend commented 6 years ago

对于编译器(机器)来说,看到的不是key这个成员,而仅仅是一段内存基址和偏移,对于存储只关注这两点,你可以在源代码定义任意的成员变量,安排好结构体,编译器只会转换成基址和偏移。

zjbbuaa0817 commented 6 years ago

我还是不理解 编译器都不知道key这个成员的存在如何知道其偏移是多少呢?因为你这个成员是定义在另外一个结构体里面的。比如offset宏的实现 #define offsetof(s,m) (size_t) &(((s*)0)->m) 也是通过结构体的变量以及指针类型获取其偏移,root这个bplus_node结构体他根本不知道里面key和data两个成员存在,如何就通过这个语法获取了这两个成员的偏移呢。实在困扰已久,再次打扰一下。

begeekmyfriend commented 6 years ago

key data sub都是我定义的宏啊,你不看宏定义实现么?

rocklee104 commented 6 years ago

当时我也被这个宏命名误导了:-)

begeekmyfriend commented 6 years ago

@rocklee104 奇技淫巧~

zjbbuaa0817 commented 6 years ago

感谢,不过这个宏的名字太让人误解了。

begeekmyfriend commented 6 years ago

你能想出更好的表达方式吗,使得源代码整体看上去简明易懂?

zjbbuaa0817 commented 6 years ago

我个人喜欢把宏函数弄成全大写的,KEY(root)[0]=key,这样也不会误导了。