簡體   English   中英

我可以同時實現動態多態和靜態多態的所有功能嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM