簡體   English   中英

對於什么參數是std :: vector <void*> ::保留O(1)時間操作?

[英]For what argument is std::vector<void*>::reserve an O(1) time operation?

我對至少一個大概的答案感興趣:

int n;
...
std::vector<void*> vectorOfPointers;
vectorOfPointers.reserve(n);

上述程序在O(1)中最多可以運行n個

讓我們假設對於運行32位Ubuntu和3 GB內存的筆記本電腦,不運行任何其他程序。 是幾萬,幾百萬還是幾百萬? 一個人需要知道哪些信息才能提出這樣的問題? 有沒有一種方法無需進行任何實驗就能找出答案?

我從未研究過有關操作系統的任何內容,但在我的想象中,操作系統僅通過兩步就可以分配內存。 它確定開始塊的指針和塊結束的指針。 這種情況可能會更加復雜,因為系統可能必須整理以獲取足夠大的內存塊。 但是,如果我們假設系統僅運行一個程序,那么如何估算所需的時間呢? 除了內存碎片,還有其他方面需要考慮嗎?

編輯:

抱歉,我沒有明確說明我的問題。 重要的是要考慮到向量在調用保留之前為空,因此不需要復制數據。

使用reserve()時,不能依賴O(1)的復雜性。

復雜

容器尺寸成線性

(cf cppreference

基本上,新內存的分配是固定的,但是您還需要將舊元素從以前的內存復制到新的內存中(因此線性復雜度很高)。

因此,在空向量上,儲備金可能具有恆定的時間,但是我不確定標准是否明確聲明了它。 因此,它可能取決於基礎實現(即使我看不到任何理由不這樣做)。

從C ++的角度來看,代碼需要O(1)時間(在容器的當前大小中是線性的,在您的情況下,它始終為零)。

現在,看來您的問題確實與分配m字節內存的復雜性有關。 恐怕這是不確定的。

有關更多討論,請參見內存分配的時間復雜度

除了在另一個問題中已經說過的內容外,還涉及幾層復雜性:

  • 首先, malloc()需要維護其內部數據結構。 這樣做的復雜性沒有指定,但是人們希望malloc(m)不會花費Θ(m)時間。 但是,復雜度很可能取決於其他因素,例如內存碎片。
  • 其次, malloc()可能需要從OS請求額外的內存。 在這里,期望操作系統對它分配的每個內存頁都做些事情是合理的(例如擦除它,這樣您就不會看到別人的機密數據)。 如果發生這種情況,則運算的確為Θ(m)

我能想到的唯一O(1)std::vector::reserve() ,當n <= capacity() ,意味着reserve()不執行任何操作。

暫無
暫無

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

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