事實上(至少在最現代的cpus上)是堆棧和堆執行相同的操作,因爲它們都只是RAM的一部分。所以解引用指針幾乎是一樣的。
不同之處在於堆棧是爲您的進程/線程預分配的,因此您不需要使用malloc
和free
系統調用即可使用它。特別是malloc
是昂貴的。另一個區別是可能有一些特定的CPU指令用於使用堆棧來提高性能(例如程序集的push
,pop
)。然而,這些不太可能與內存訪問有關(如將內存加載到寄存器)本身。
另一個區別是,如果你用完堆棧,你的程序將會(更可能)崩潰。雖然如果你用完堆,那麼你的操作系統可能會使用交換爲你降低性能成千上萬次。
緩存未命中當然是一個因素,它會更經常發生在堆上,然後在堆棧上。但是,這只是因爲與堆棧相比堆很大。但請注意,除非您編寫的代碼非常繁重,否則緩存未命中並不重要。
現在你是對的std::vector
必須解除引用附加時間。但是這裏緩慢的是解引用,而不是堆棧或堆中的指針。它們在哪裏並不重要。雙引號總是比單引號慢。
現在棧和堆也可能位於不同的物理設備上。而且這兩款設備的速度不同(可能會使堆速更快)。但是這又與堆棧和堆本身無關。這可能發生在內存的任何兩個部分。而且你無法對此做任何事情。甚至沒有操作系統可以(可能,也可以,我不確定)。這是主板的事情。無論如何,主板很可能會爲更快的設備降頻。
沒有道理。這取決於您的整個系統 - 代碼和硬件。在[NUMA機器]上更爲複雜(https://en.wikipedia.org/wiki/Non-uniform_memory_access)。如果您確實需要知道,請分析您的應用程序並進行測試。 –
錯誤,堆棧和堆都不與物理驅動器相關聯。 –
當內存訪問轉到'swap'(通常在物理驅動器上)時,您的代碼不再是'快速',既不堆棧也不堆棧。 –