[英]Can I achieve all the functionality of dynamic polymorphism with static polymorphism?
我習慣於使用dynamic polymorphism
並且一切正常,但是在閱讀了static polymorphism
我得出的結論是,后者消除了動態static polymorphism
的開銷。
這是動態多態性的一些開銷:
每次對虛擬方法的調用都需要額外的間接調用(指針取消引用)。
通常無法內聯虛擬方法,對於某些小型方法而言,這可能會造成巨大的成本損失。
每個對象的附加指針。 在當今流行的64位系統上,每個對象8個字節。 對於攜帶少量數據的小對象,這可能是一個嚴重的開銷。
誰能用一個非常簡單的例子向我解釋Static polymorphism
。 在什么情況下我應該使用它而不是動態的?
我找到了這個示例,但是對不起,我不明白。 看起來模棱兩可:
#include <iostream>
using namespace std;
template <typename Child>
struct Base
{
void interface()
{
static_cast<Child*>(this)->implementation();
}
};
struct Derived : Base<Derived>
{
void implementation()
{
cerr << "Derived implementation\n";
}
};
int main()
{
Derived d;
d.interface(); // Prints "Derived implementation"
}
讓我們首先分析一下在編譯發送的代碼之后會發生什么。 編譯器將生成兩個類,並且在方法接口內部,它將僅將指針移動到Derived對象所在的地址,並使用該指針調用方法實現。
因此,現在只有開銷,那就是我們應該為每個派生類生成更多的類(我的意思是二進制代碼)。
你現在想念什么?
考慮以下代碼:
Base* base;
if(a)
base = new DerivedA;
else
base = new DerivedB;
base->interface();
變量a的值僅在運行時才知道,因此只能對其使用動態多態。
如果它是靜態多態性,那么您應該已經知道派生類的類型。
Base<DerivedA> * base;
Base<DerivedB> * base;
哪一個不允許您根據運行時上下文來決定。
靜態多態性是函數重載的替代名稱。 這是一項便利功能,可讓您避免僅使用另一組參數即可重命名功能。
當函數在運行時確定時,它與實際的調度機制動態多態性完全正交。
注意:動態多態性的開銷是如此之小,以至於在對程序進行概要分析並發現開銷很大之前,您不應該考慮它。 這種情況很少發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.