[英]How does compiler fetch elements from array of objects in constant time?
每當我們想根據索引從數組中獲取元素時,我了解到編譯器只是做這樣的事情來在恆定時間內獲取元素:
array_addr + ele_size * (i - first_index)
(其中ele_size
取決於數組中存在的元素的類型,例如對於array[int]
ele_size
將是 4 個字節)
那么,當每個object
可能具有不同的大小(在內存中)時,編譯器如何在恆定時間內從array[object]
獲取元素?
PS:問題不針對任何語言
那么編譯器如何在恆定時間內從
array[object]
獲取元素(因為對象的大小可能會有所不同)?
好吧,正在評估的表達式是:
array_addr + ele_size * (i - first_index)
其中ele_size
是一個常數,它取決於數組的(編譯時)類型,而first_index
通常也是一個常數; 例如,C、C++、Java 等為零。
那是一個減法(當first_index
不是常數零時),一個乘法,一個加法,可能還有一個 memory 提取或兩個。
無論哪種方式,執行計算所需的機器指令數都是一個常數。 因此(關於變量 memory 獲取時間、流水線效果等的模數爭論)一次這樣的計算所花費的時間將是一個常數……與名義表達式參數的值無關。
Quibble:編譯器不獲取元素。 它生成將獲取元素的代碼......當代碼執行時。
array[object]
和array[int]
實際上非常相似,因為對象數組通常不會像這樣將實際對象直接存儲在一起:
// [ _______Person________, _____Pet_____, _______Person_______ ]
[ Name, Age, Country, Name, Type, Name, Age, Country ]
[ "Lucas", 37, FRANCE, "Misty", CAT, "Emma", 22, SWEDEN ]
相反,該數組只存儲對對象的引用(指針),這些對象的大小都相同(32 位或 64 位 int):
// [ ______Person______, ________Pet_______, ______Person______ ]
[ address of Person, address of Pet, address of Person ]
[ 0xaba11b8ae55fa4d2, 0xb8e4f4adea6be036, 0x5ce415a69ca50222 ]
然后在特定的 memory 地址中找到每個 object 的數據,並且可以占用任意多個字節。
您可能會發現這個關於object[]
如何存儲在 memory(在 C# 中)中的問題很有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.