2012-08-03 64 views
4

我的問題與C++類定義有關。我明白,如果班級中存在許多成員變量。班級的規模將會增加。但是,增加類成員函數的數量不會影響其大小。但是,我想知道具有更多成員函數的類和具有更少成員函數的類之間的主要區別是什麼。調用具有較少成員函數的類會更快嗎?類成員函數編號的影響

+2

只是出於好奇...你怎麼提出這個問題? – Qnan 2012-08-03 15:22:07

+0

*編譯*需要更長的時間,但之後不會有任何區別。編譯器會指出如何直接調用每個函數。 – 2012-08-03 15:27:05

回答

2

不,唯一能夠在所有這方面產生任何影響的功能都是虛擬功能,而且無論您擁有多少功能,它們的速度都比平時慢很多。在所有其他情況下,編譯器確切地知道在調用特定函數時要運行哪些代碼,因此不必進行任何搜索,並且方法的數量無關緊要。

+3

*顯着較慢*按什麼標準?虛擬功能調度非常高效,在大多數情況下只需要一個額外的間接尋址。 – 2012-08-03 15:24:53

+0

@DavidRodríguez-dribeas他當然意味着比非虛擬成員函數慢得多。 – log0 2012-08-03 15:26:19

+0

@DavidRodríguez-dribeas效率當然是一個相對的術語。但是,在真正關鍵性能的位中,使用非虛擬方法可能會更好。 – Qnan 2012-08-03 15:29:22

1

不,成員函數的數量對調用函數的速度沒有影響(至少在任何理智的實現中)。任何對函數的調用都將被編譯成設置函數參數的代碼,然後使用調用指令。編譯器在編譯時解析該函數​​的地址,並在呼叫指令中使用該函數,或者在虛擬函數中使用虛函數在表中查找要調用的地址。

4

您需要每個實例的空間來存儲成員變量,但成員函數不是實例的一部分,至少不是直接的。通常每個額外的虛擬成員函數都需要一個額外的指針,但該指針指向vtable,該指針在類的所有實例中共享,因此不會添加到每個成員的大小。

非虛擬成員函數只佔用代碼內存中的空間:它們的空間需求與獨立函數沒有區別,唯一的區別是將指針傳遞給this的隱藏參數。

添加到類中的第一個虛函數會爲存儲實例所需的空間添加一個額外的指針;額外的非虛擬成員函數根本不參與空間需求。

1

功能較少的類不會比具有較多功能的類更有效。

功能效率受算法和I/O的影響最爲顯着。

但是編譯時間會受到影響。