簡體   English   中英

此特定的內部非靜態類是否有大量開銷?

[英]Is there significant overhead for this particular inner non-static class?

我正在編寫自己的用於學校作業的雙向鏈接列表的實現,並且在列表類內部使用了一個稱為Node的內部節點類,該內部節點類表示彼此鏈接的列表節點(通常是鏈接列表的情況)。

class DoublyLinkedList<T>
{
    class Node
    {
        T obj;
    }
}

我想知道,對於具有多個節點的大型列表,由於每個Node對象都可以引用父列表類的一個實例,因此這是否是一項重大的開銷和次優的設計? 作為非靜態類肯定很方便-然后節點可以更改父列表的firstlast引用,我發現這對於封裝非常有用。

如果我將Node設為靜態,則無法再使用它(沒有對列表的顯式成員引用) firstlast操作父列表,而我不得不從另一種方式來處理它-列表將通過以下方式分配和操作節點它自己的方法,即將它們彼此鏈接,取消鏈接並自然地調整其firstlast值。

為了良好的設計和學習,我想知道什么是聰明的事(c) (如果有)?

如果內部類不是static則已經存在對父類的隱式引用,您可以從Node類內部通過DoublyLinkedList.this進行引用。

無論如何,我看不出為什么Node類應該能夠直接修改其父類的屬性。 更改列表的方法(同樣也是firstlast )應該是DoubleLinkedList類的,而不是Node類的。 正是出於封裝的目的, Node實例不應該知道它的包含位置或如何從外部使用它。

開銷恰好是每個節點一個參考。 假設除有效負載外,該節點還具有一個先行鏈接和一個反向鏈接,那么在額外的內存使用中,對父級的額外引用的開銷將約為33%(在3個現有引用的基礎上增加1個引用)。 這是相當大的開銷,尤其是對於大量節點和較小有效負載而言。 另一方面,對於較大的有效負載,這沒什么大不了的。

不過,總的來說,我不會假設有效負載大小,而是將Node類設置為static

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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