2011-09-25 48 views
10

我正在通過EASTL's list class來看看作者如何實現節點。我的期望是一個簡單化的階級/結構。相反,我看到一個基礎和一個從這個基礎繼承的節點(仍然簡單,但爲什麼是兩個類?)。他的言論解釋爲什麼:模板類型在C++中浪費空間嗎?

我們從ListNode(下同)分別定義ListNodeBase,因爲它允許 我們有非模板操作,如插入,刪除(下圖),它 使得它,以便列表錨節點沒有攜帶T,這會浪費空間並且可能導致令用戶感到驚訝,因爲用戶沒有明確創建的多餘Ts存在 。所有這一切的不利之處在於, 由於節點指針是 類型的ListNodeBase而不是ListNode,它使得調試更難於查看列表。但是,請參閱下面的ListNodeBaseProxy。

我不明白這裏的一些事情。我對做了些什麼瞭解了爲什麼它會使調試查看有點困難,但是他的意思是list anchor node doesn't carry a T with itwould waste space and possibly lead to surprising the user due to extra Ts existing that the user didn't explicitly create

回答

7

如果沒有幫助程序類,列表根節點將包含從不使用的T實例。第二句話是說你可能不希望空列表創建一個T.例如,創建一個T可能有副作用。

1

在我看來,這個想法是將列表的抽象與它所攜帶的數據分開。當你真正想要訪問數據時,你只需要ListNode,其餘的都可以在摘要ListNodeBase上完成。這就是我的理解list anchor node doesn't carry a T with it

還有關於空間的東西。模板類是爲每種類型創建的,所以如果您有幾種不同的類型用於T,而不使用ListNodeBase,則您將創建每種類型所有操作的模板副本,並且 - 您沒有,並且LinkNode僅繼承它們,並且僅需要實際數據的內存。在這種情況下,似乎節省的空間是指代碼的實際大小。

+0

您不使用沒有數據的列表。有一個名爲** anchor node **或** sentinel **的單個節點,即使在空列表中也存在於每個列表實例中,以消除某些與空列表關聯的特例代碼。這是一個不需要包含用戶數據的節點。 –

+0

@ n.m。這將是類'list',你可以看看OP發佈的鏈接的實現。由於'list'本身就是哨兵,所以這一點是沒有意義的。 – littleadv

+0

我看了。據我所知,'list' *包含'base_node_type mNode;'行的標記。 –

1

你真的想支持空列表。如果頭節點本身總是包含一個T,並且每個列表包含一個頭節點,那麼每個列表至少包含一個T,因此永遠不能爲空。