這是餐桌上一個必點菜,大家都知道,根本不是獨家秘笈,但是看了無數次文章和book,依然完全被錘,停留 表面上,完全不知道對方在想什麼,
其實很簡單,就這樣呀。
感覺沒問題就是最大的問題。
無論任何公司阿里,滴滴,還有騰訊,還是普通公司
都上這個菜,這就是一條線索,故事的線索。
別人都知道,我不知道 才是最尷尬的地方
C++通過指針實現了多態,運行時函數重載決議,
是他最有優秀地方,但是也是最讓人痛苦地方,
內存模型假設存在讓對象生命周期管理更加複雜。異常總是在看不到地方出現。怎麼辦?
然後出現了智能指針,這能說拆東牆補西牆嗎?
為了保證正確拷貝賦值,
虛指針和智能指針在類型轉換 採取哪些措施保證唯一或者正確 ,
這可能是隱藏的副本,boss任務。
我需要你必須重視起來,思想上重視就是口號,必須採取行動必須閱讀
RocksDB是使用C++編寫的嵌入式kv存儲引擎 和看到別人是怎麼用的,從這裡開始,
簡述C++虛函數作用及底層實現原理(牛客)
思考:複製操作和虛函數有關係嗎?
問題1:什麼複製拷貝
問題2:默認拷貝對虛函數做了什麼
參考 https://blog.csdn.net/chaoguo1234/article/details/81277613
問:系統自動合成的default copy assignment operator對虛函數有什麼操作?
A class does not exhibit bitwise copy semantics for the default copy assignment operator:
When the class declares one or more virtual functions (we must not copy the vptr address of the right- hand class object, since it might be a derived class object)
問題3:什麼是move copy
標準庫:如何使用
疑問:既然虛函數表,在編譯時候確定了,並且放到只讀數據段,問題來了,如果繼承重寫需要修改裡面函數地址給怎辦?並且不同對象 this不一樣,虛函數表 只讀數據段 怎麼確定 每個對象函數運行地址怎麼共用呀?這不是自相矛盾?
https://maimai.cn/web/gossip_detail?gid=28548835&egid=f9572a925d4d11ebbb08801844e2d86c
使用gdb探索 C++ 虛函數表不同對象,創建不同的虛指針嗎?創建不同的虛函數表嗎?,
一個類可以創建多個對象 在創建對象時,編譯系統只為對象中的成員數據(成員變量)分配內存空間 而同類對象的成員函數的代碼卻是共享的。
內部的成員函數:普通函數:不佔用內存。虛函數:要佔用4個字節,用來指定虛函數的虛擬函數表的入口地址。所以一個類的虛函數所佔用的地址是不變的.
set print object on(gdb) n39 Derived d; (gdb) n40 Derived d1; (gdb) p d$1 = (Derived) {<Base> = { _vptr.Base = 0x555555755d48 <vtable for Derived+16>}, <No data fields>}(gdb) p d1$2 = (Derived) {<Base> = { _vptr.Base = 0x555555755d48 <vtable for Derived+16>}, <No data fields>}(gdb)
(gdb) p /a *((void**)0x555555755d48)(gdb) shel c++filt _ZTI7Derivedtypeinfo for Derived虛函數的間接調用
只有對於通過指針或引用的方式調用虛函數才是間接調用
普通方法的調用是直接將地址寫在調用位置的,稱作直接調用 ;
那在有了virtual關鍵字之後再通過指針或引用調用 時,編譯器在編譯時肯定不會直接寫,因為它需要查表才能知道要調用哪個方法,所以稱作間接調用 ,需要注意,只有通過指針或引用來調用才會發生間接調用
從彙編角度分析g++編譯器如何實現虛函數動態綁定
g++ -S -g class_virtaul_fuc.cpp call _ZN6ClassBC1Evcall *%rdx