我在C上的初學者課有筆記,其中說malloc
返回一個指向與x86機器上的16字節邊界對齊的塊的指針。malloc邊界大小:是否存在性能差異
這是否意味着調用malloc(1)
沒有優勢,即性能與調用malloc(16)
沒有區別?
我在C上的初學者課有筆記,其中說malloc
返回一個指向與x86機器上的16字節邊界對齊的塊的指針。malloc邊界大小:是否存在性能差異
這是否意味着調用malloc(1)
沒有優勢,即性能與調用malloc(16)
沒有區別?
C標準說
指針返回如果分配成功,則適當地對準,使得它可以被分配給一個指針到任何類型的對象與基本對齊要求然後用於訪問分配空間中的這樣的對象或這樣的對象的數組(直到空間被明確地解除分配)。
所以指針對齊不是16字節,而是實現定義的;並在你的實現它碰巧有某些類型的對象需要在內存中的16字節對齊;因此malloc返回的指針是16字節對齊的。
然而,這並不意味着該char *p = malloc(1)
16個字節分配內存 - 相反,你不觸及任何內存到p[0]
; malloc
也需要一些內部簿記,因此malloc(1)
消耗總共16字節的內存,而malloc(16)
會消耗32或64;你不會知道。
每次調用malloc
都不要求它向操作系統請求內存。它要求操作系統需要內存中的大卡盤,然後爲你分配一些。在將來的調用中,它將有一點空間,可以將它分配給你,而不需要詢問操作系統。
因此,它會分配便於處理器使用的內存 - 通常是對齊的。
您應該只分配所需的內存,並讓其他malloc
。
謝謝,但是如果它永遠不會將其他15個字節重新分配給其他任何人以維持16字節邊界,那麼它是否具有與始終以16字節塊一樣工作的效果? –
我偶爾看到malloc(1)。每次看到它,我都會畏縮。這就像使用一輛40噸卡車去上班。 –
這取決於實際的實施。 – 2501
謝謝。我想更好地理解'malloc',不是因爲我需要調用'malloc(1)'。 –