C 式 OO 與 C++ virtual function 效能差異
首先換個標題,不然老有人覺得這和原 po 要問的東西沒關聯。
推
03/08 12:52,
03/08 12:52
→
03/08 12:53,
03/08 12:53
是的,是記憶體位置的關係。
推
03/08 13:48,
03/08 13:48
→
03/08 13:50,
03/08 13:50
→
03/08 13:51,
03/08 13:51
→
03/08 13:51,
03/08 13:51
→
03/08 13:55,
03/08 13:55
→
03/08 13:56,
03/08 13:56
→
03/08 14:26,
03/08 14:26
推
03/08 14:28,
03/08 14:28
我找到了罪魁禍首,那就是 new。若在 C++ 的版本中改用 malloc
來配置空間呢?
void* buf = malloc(sizeof(Double));
Data* data = new(buf) Double(1.0);
結果是 C++ 的版本和 C 速度完全相同了!而且也和直接使用
function pointer 而不用 vtable 的速度相同。
為什麼使用 new 和 malloc 得到的記憶體會有效能上的差別,我猜
原因可能是 new 得到的記憶體區塊比較倒霉,比如說它剛好和
kernel 中的某些其它資料占據同一個 cache set 導致 miss rate
增加。這邊就要請比較了解這方面的板友指教了。
當然,效能魔人可能就會提出另一個質疑,那就是在 C++ 中大家都
用 new,除非是特殊需求才會自己去改寫 new。但以原 po 的問題來
看,寫 kernel 剛好就符合這個「特殊需求」,因為在 kernel 內部
配置記憶體的功能一定是自己寫的。另一方面,用個 operator
overload 來改寫預設的 new 也不是那麼困難的事。
結論:若要達到動態多型的功能,使用 C function pointer 來實作
並不會比 C++ virtual function 還快,效能是相同的。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.121.120.91
→
03/08 15:18, , 1F
03/08 15:18, 1F
→
03/08 15:19, , 2F
03/08 15:19, 2F
→
03/08 15:19, , 3F
03/08 15:19, 3F
※ 編輯: littleshan 來自: 59.121.120.91 (03/08 15:20)
推
03/08 15:35, , 4F
03/08 15:35, 4F
推
03/08 15:49, , 5F
03/08 15:49, 5F
推
03/08 15:54, , 6F
03/08 15:54, 6F
→
03/08 15:54, , 7F
03/08 15:54, 7F
推
03/08 21:10, , 8F
03/08 21:10, 8F
推
03/08 22:28, , 9F
03/08 22:28, 9F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章