2010-02-15 91 views
1

也許我總是有愚蠢的問題,但不知何故我不能谷歌了我應該如何存儲變量,所以它是有效的。我們的C++老師剛開始討論了存儲數據類型的大小如何影響存儲數據的速度(比如搜索最接近的連續內存塊),我想了解更多信息。你能給我一些指導嗎?有效存儲數據

+0

這功課嗎?如果是這樣的標籤。 – 2010-02-15 16:42:47

+0

已標記,不退款無退貨。 – 2010-02-15 17:27:27

+0

這是不明確的。關於動態內存分配還是變量類型,或者在這種情況下「有效」意味着什麼,這一點並不明顯。 – 2010-02-15 17:30:57

回答

2

通常對於數值變量(例如循環計數器),應該使用「int」並讓編譯器爲該任務選擇最有效的大小。如果您特別需要特定的大小(例如uint16表示從網絡接收的數據包標頭的16位部分或類似數據),則使用typedef,在特定平臺上給出該特定大小;否則,只需使用int。也就是說,你的老師可能一直在談論動態內存分配器(即「malloc」和「free」背後的代碼)。如果您請求分配64個字節,比方說,分配器負責爲您提供一個至少具有該大小的塊,並對其進行跟蹤,以便在釋放時將其返回到可用存儲。有很多關於這些的信息,例如這裏的維基百科: http://en.wikipedia.org/wiki/Dynamic_memory_allocation

+0

是啊,這可能是他在說什麼..感謝很多,我會檢查出來 – Pyjong 2010-02-15 16:37:09

+0

對於循環計數器,我想說當它看到for(int i = 0 ; ...; ++ i)'>如果它是積極的,我寧願看到它的類型,所以每個人都很清楚。因此我通常最終會得到一個'size_t' ...另外,如果它使用的函數需要特定的類型,我寧願從頭開始執行它,爲什麼在轉換過程中支付轉換費用? – 2010-02-15 18:56:49

0

你是指內存中的持久存儲或分配?

在內存中,您定義的數據結構,爲您的數據結構(堆或棧)分配內存的方式以及C++標準共同決定內存的分配方式。

持久性存儲是一個完全不同的故事。

+0

我不知道..這兩個術語中的哪一個是我的老師談論的。他說了類似的內容,以避免內存泄漏,你應該先以某種方式分配一些空間,然後將相同類型的變量存儲在彼此的旁邊,因爲如果不是這樣,有時可能會發生操作系統不得不以某種方式拆分數據的情況,根本不使用一些空間,因爲分割它太低效。 – Pyjong 2010-02-15 16:34:03

0

如何存儲變量很少取決於您。但是變量的類型和大小通常取決於你。

他可能指的是「如果你需要存儲一個小整數,像街道地址,你應該不會使用long,而是使用short」。這些事情往往需要相當多的領域知識,很容易將自己優化到一個角落(例如考慮千年蟲問題)。

0

一種方法是使用變量類型。不需要在int64中存儲從1到10的值。我們的想法是將變量的可能值與最適合其可能值的變量類型進行匹配。這將減少使用的內存,並減少更復雜的數據結構,從而降低處理速度。

0

數據寫入和檢索的速度將受到本地存儲機制性能的影響。在現代CPU上有寄存器,2級緩存(L1 & L2),DRAM和有時磁盤(通過交換)。如果訪問模式和大小有效地利用L1緩存(即小且本地一致),那麼一旦數據在L1中,只需將其加載到寄存器中以供CPU訪問。如果所需數據位於L2高速緩存中,則它必須先加載到L1中,然後才能加載到寄存器中進行處理。 DRAM到L2到L1到寄存器也是如此。寄存器比L1快,L1比L2快,DRAM慢。

香草薩特給在NWCPP幾年前,解決這些問題的演講:

http://video.google.com/videoplay?docid=-4714369049736584770#

從編程的角度來看,如果你的數據可以容納一個高速緩存行內,需要重複訪問或寫入到,由於更少的緩存未命中(導致需要從更高級別的緩存中獲取),您將獲得更高的性能。對於註冊的所有「緩存」級別,L1,L2,DRAM,磁盤或遠程服務器都是如此。

0

你的老師可能的意思是,當你在堆上分配一個對象時(new),整個過程往往會越慢,對象越大。我寫了a little program來衡量這種影響。

下面是結果我得到(與VS2008和優化釋放模式編譯關閉):

Cost of allocating 1 chars: 0.104 microseconds 
Cost of allocating 4 chars: 0.1 microseconds 
Cost of allocating 16 chars: 0.104 microseconds 
Cost of allocating 64 chars: 0.128 microseconds 
Cost of allocating 256 chars: 0.192 microseconds 
Cost of allocating 1024 chars: 0.416 microseconds 
Cost of allocating 4096 chars: 1.28 microseconds 
Cost of allocating 16384 chars: 2.56016 microseconds 
Cost of allocating 65536 chars: 3.0722 microseconds 
Cost of allocating 262144 chars: 3.58423 microseconds 

所以你的老師是對的,而分配大對象可以比分配正常大小的物體顯著慢(但是速度非常快,但是在最壞的情況下我們正在談論幾微秒)。