2010-10-26 77 views
3

我已經被告知,我應該總是使用size_t總是當我想要32位unsigned int,我不太明白爲什麼,但我認爲這與如果有人在16或64位機上編譯程序有關,unsigned int會成爲16或64位,但size_t不會,但爲什麼不呢?以及我如何強制位尺寸正是我想要的?C++:數據類型,要使用哪些?

那麼,哪個數據類型的列表在哪裏使用?例如,是否有size_t替代unsigned short?或爲32bit int?等等。我怎麼能確定我的數據類型的位數與我在第一個地方選擇的一樣多,而不需要擔心其他機器上的不同位數?

主要是我更關心的使用,而不是邊際速度提升我從內存使用加倍獲得的記憶,因爲我已經沒有太多的RAM。所以我想停止擔心如果我的程序編譯在不是32位的機器上,一切都會分解。現在我使用size_t總是當我想要它是32位,但short我不知道該怎麼做。有人幫我清理了我的頭。

在另一方面:如果我需要64位大小可變的,我可以用它在32位機器上的成功?和那個數據類型名稱是什麼(如果我希望它總是64位)?

回答

1

size_t並不總是32位。例如。它在64位平臺上是64位的。

對於固定大小的整數,stdint.h是最好的。但它不會與VS2008或更早版本 - 你必須download it separately。 (它是VS2010和大多數其他編譯器的標準部分)。

由於您使用的是VS2008,因此您可以使用特定於MS的,unsigned __int32等類型。文檔here

要接聽64位的問題:大多數現代編譯器有一個64位的,即使是在32位系統。編譯器會做一些神奇的工作。對於Microsoft編譯器,您只能使用__int64unsigned __int64類型。

+0

'size_t'早在64位之前存在......我應該知道,我在1990年代後期和2000年初的Borland C++編譯器中使用它。 – 2010-10-26 12:18:35

+1

[Where is in Visual Studio?](http://stackoverflow.com/questions/1156267/where-is-inttypes-h-in-visual-studio-2005/1156285#1156285) – sbi 2010-10-26 12:19:40

+0

一般來說,我會建議使用''中的類型,因爲它們可用於VisualStudio和幾乎任何其他C++編譯器。 – 2010-10-26 12:23:59

3

size_t用於存儲對象大小。它的大小恰到好處,僅用於此目的 - 32位系統上有4個字節,64位系統上有8個字節。您不應該將它與unsigned int或任何其他數據類型混淆。它可能相當於unsigned int或者可能不取決於實現(包括系統位數)。

一旦你需要存儲不是一個對象大小以外,你不應該使用size_t,而應該使用一些其他的數據類型。

+0

我也想補充一點'size_t'是由'sizeof'運算符的類型。然而,實際上'size_t'不僅僅是*用於存儲對象大小。例如,它被各種標準庫函數(如memcpy)用來存儲數組長度。 – 2010-10-26 12:21:31

+0

呃,沒有memcpy在'unsigned char [N]'上工作?即數組長度和對象大小沒有區別。另外,你通常會把一個'sizeof(struct T)'傳遞給'memcpy',這隻有當你把memcpy看作一個對象的大小時纔有意義。 – MSalters 2010-10-26 14:08:26

2

補充說明:對於容器,以表明它們的大小,不要使用size_t,使用container<...>::size_type

+2

我不這麼認爲,除了嵌入式系統編程。對於普通的通用代碼來說,它增加了冗長度,降低了清晰度,並且什麼也沒有獲得:-) – 2010-10-26 12:28:56

+0

@Alf:編寫通用代碼時,這可能很有用,因爲您可能不僅需要包含標準容器,而且還需要其他一些與STL兼容的容器,例如,size_type可能無符號短。它確實增加了冗長度,我同意,但我認爲這不是一件壞事。雖然顯然我應該同意我從不自己寫size_type。除非在通用代碼中 – 2010-10-26 12:37:23

0

不幸的是,數據類型的性質的怪癖之一是,它取決於你使用哪個編譯很大。當然,如果您只編譯一個目標,則無需擔心 - 只需瞭解該類型使用的大小是多少即可。

如果需要交叉編譯,你可以確保通過定義每個目標自己typedef兼容的操作系統(包圍#ifdef塊,參照該目標你是交叉編譯到)。

如果您曾經擔心可以在使用尺寸甚至超過預期尺寸的類型的系統上進行編譯,您可以始終使用assert(sizeof(short)==2)或同等版本,以便您可以保證在運行時使用正確尺寸的類型。

您的問題被標記爲visual-studio-2008,所以我建議您在該編譯器的文檔中查找預定義的數據類型。 Microsoft有一個預定義的數字,如​​,DWORDLARGE_INTEGER

查看windef.h winnt.h瞭解更多信息。

2

size_t不是不是必然是32位。一些編譯器已經有16位了。它在64位系統上是64位的。

C++標準通過參考C標準保證long至少爲32位。

int僅在形式上保證16位,但實際上我不擔心:在16位系統上使用任何普通代碼的機會確實很少,在任何32位系統上都是32位位。當然,如果你爲一些嵌入式計算機這樣的16位系統編碼,情況就不一樣了。但在這種情況下,您可能會編寫特定於系統的代碼。

如果您的編譯器支持該標頭(它是在C99中引入的,並且當前的C++標準源於1998年)或者相應的Boost庫標頭boost/cstdint.hpp,那麼在需要確切尺寸的地方可以使用<stdint.h>

但是,一般情況下,只需使用int即可。 ;-)

乾杯&心連心,