2017-11-04 38 views
-2

我學習了python一年。在演講幻燈片中,我看到編譯器通常分配4個字節來存儲列表中的項目。列表中的項目需要的內存

爲什麼編譯器不能動態分配內存?例如,如果我有一個很小的值,爲什麼編譯器只是分配1或2個字節來存儲它,它會更有效率嗎?

+1

在內部,CPython'list'使用指針數組來存儲對每個項目的引用。這些指針在32位機器上佔用4個字節= 32位,在64位機器上佔用8個字節。這些項目本身會佔用不同數量的RAM,當你在'list'上調用'sys.getsizeof'時,這些RAM不會被報告。 –

+0

我不知道你在哪裏得到這個印象。從根本上說,列表和數組是非常不同的數據結構,您不應該混淆。原始陣列的大小,他們可以和確實使用其元素的廣泛變化的大小。例如,只有數字,你可以有8,16,32和64位整數。在CPython中,列表被實現爲Py_Object指針的動態數組。每個指針通常佔用一個機器字,因此64位系統上有8個字節,32位系統上有4個字節。但是這並不能解釋Python對象的內存,這可能是任意大的...... –

回答

0

什麼是32位整數,其中一位是符號位,31位代表數字?一個字節等於8位,一個整數是32位,那麼爲什麼他們用8個字節來表示它,他們在一些你看到64位的計算機中浪費4個字節btw,它們可以使用8個字節,它只會影響更大你可以代表的數字。位越多==>數量越多。它只是關於你的處理器和它的寄存器。

0

列表或數組中的元素佔用4個字節是不正確的。

在具有強靜態類型的語言中(也就是說,在使用它之前必須聲明變量的類型),數組的大小恰好取決於數組的大小乘以該類型的每個變量的大小。在C中,char類型通常使用一個字節,而int類型使用的字節數量取決於系統的體系結構。

在Python等動態類型的語言中,所有變量都被實現爲包含指針的對象(指向實際存儲數據的內存中的位置)和標籤(指示變量的類型,它將在運行時用於確定執行操作時變量的行爲)。

4字節的問題可能是指許多體系結構使用4個字節的整數的事實,但這是巧合的,這是一個考慮它的規則。

+0

這是真的,它取決於您使用的處理器。使用64位處理器,您可以處理2 * 32位整數,這是因爲您可以考慮具有64位的寄存器。 –

+0

從這個意義上說,它並沒有推廣到大多數編程語言或處理器,因爲它是由問題隱含的。正如我所說,在特定情況下可能是正確的,但在大多數語言中不是這樣。 – Tiago1984

+0

那麼,你能告訴我一個命令式的語言,其限制不受限制嗎? –