簡體   English   中英

編譯器如何在恆定時間內從對象數組中獲取元素?

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

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