[英]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.