陈述拿起矿泉水,喝了一口后,不紧不慢地回答道:
“O(1)只是不考虑定位节点的理论值,CPU缓存预取机制对连续内存更友好,链表节点分散在堆内存会导致cache miss率飙升。”
“所以Linux内核用kmem_cache做对象池,Golang的slice在append时容量翻倍也是这个原理。”
本小章还未完,请点击下一页继续阅读后面精彩内容!
一长串专业术语让在场的所有人都是一愣,胡静眯了眯眼睛,看向陈述,语气依旧不善:
“教科书背的不错。”
“那你说说,用C语言实现双向链表时,怎么用单指针域同时存储前驱和后继地址?”
陈述将胡静的笔记本电脑拿了过来,敲出了一段代码,随后将电脑屏幕转向胡静:
“XOR双向链表。”
“不过,没人会真的这么写,因为现代CPU的乱序执行会导致内存访问预测失效”。
随后,陈述指了指Intel的优化手册,继续说道:
“ARMv8还得处理指针标签位。真要省内存不如用unrolled linked list,还能利用SIMD指令加速遍历。”
胡静的这个问题比较刁钻,是一个冷门细节。
既然如此,陈述先拿出一个冷门的解决方法,再给出一个性价比更高的替代方案。
到这一步,陈述所展现出来的理解,已然超过了这个学校百分之七八十的大四学生。
二人的对话已经超出了教室里这群大一新生的理解范畴。
他们的笔记上只有“计算机的定义”这种毫无意义的知识点,完全听不懂二人在说什么。
胡静看着陈述敲出来的这段代码,面色有些难看,但她似乎依旧没有死心。
胡静调出了调试器界面,继续问道:
“这个链表程序运行后内存暴涨,给你30秒找出问题!”
陈述嗤笑一声,声音中的嘲讽意味都快溢出来了。
真是有够丑陋的,这个问题许多初入行的人可能都回答不上来,亏胡静好意思拿出来刁难自己。
不过...这倒也能看出,胡静还是有些水平的。
这就让陈述更加不理解了。
既然有些水平,还好意思拿着这种破旧的PPT来教人,还好意思让他们做笔记?