2012-08-10 30 views
-1

可能重複:
Is there any guarantee of alignment of address return by C++'s new operation?C++新爲64字節對齊的和等於高速緩存行大小

在這個程序中,我打印由無符號返回的每個地址字符。然後最後將它們向後刪除。

#include "stdafx.h" 
#include<stdlib.h> 
void func(); 

int main() 
{ 
    int i=10; 
    while(i-->0)printf("loaded %i \n", (new unsigned char)); 
    getchar(); 
    unsigned char *p=new unsigned char;printf("last pointer loaded %i \n", p); 
    i=10; 
    while(i-->0)delete (p-=64); 
    getchar(); 
    p+=640; 
    delete p;//nearly forgot to delete this ^^ 
    return 0; 
} 

輸出:

enter image description here

正如你所看到的,每個收益64字節對齊數據。

問題:這是64字節等於緩存行大小還是隻是一個編譯器的東西?

問題:我應該使我的結構大部分是64字節長嗎?

問題:當我更改我的cpu,ram,OS或編譯器時,這會不同嗎?

Pentium-m,VC++ 2010 express,windows-xp

謝謝。

+1

'malloc'需要返回適合任何類型的指針。如果'new'具有相同的要求,或者只是針對給定的特定類型進行對齊,我就不會記得。但是,該標準沒有提及緩存行。 – BoBTFish 2012-08-10 09:34:24

+0

你的意思是,在C中它是絕對對齊的。 – 2012-08-10 09:35:26

+3

http://stackoverflow.com/questions/506518/is-there-any-guarantee-of-alignment-of-address-return-by-cs-new-operation 'new'返回一個指針對齊任何類型。 – BoBTFish 2012-08-10 09:38:29

回答

2

當您考慮大量分配和釋放後會發生什麼情況時,堆管理器的實現選擇會更有意義。

malloc()的調用需要找到足夠大小的未使用塊的塊進行分配。 它可能更大(在這種情況下,它可以創建一個有區別的空閒塊 - 或者浪費它)。尋找塊的最接近尺寸的天真策略被稱爲最適合。如果它開始創建新的空閒塊,您可以選擇將其稱爲最差離開

使用後,最適合的方法會導致大量的碎片,這是由不可能再次分配的小塊引起的,並且搜索空閒塊的成本變高。

因此,高性能堆管理器不能像這樣工作。相反,它們作爲各種固定塊大小的池分配器工作。儘管投入一些中間產品也可能是值得的(例如48,96,192...)。在這個計劃中,malloc()free()都是O(1)的操作,並且分配的關鍵部分是最小的 - 例如64,128,256,512...)可能每個池 -

內存在小分配的損耗要小得多惡,比碎片,O(n) ALLOC \ dealloc的複雜性和MT表現不佳

最低塊,獲得在多線程環境的重要。大小wrt到高速緩存行的大小是這些經典的工程折衷之一,並且它是一個安全的選擇,微軟做了相當多的實驗,以至少達到64。 FWIW,我敢肯定你會發現現代CPU的高速緩存線大小比這個大。

相關問題