3 dsp中sizeof的用法
4 sizeof的用法問題
5 其他相關問題
sizeof是c/c++中的乙個操作符(operator),簡單的說其作用就是返回乙個物件或者型別所佔的記憶體位元組數。
c語言中,對 sizeof() 的處理都是在編譯階段進行,所以它可以被當作常量表示式使用。其作用就是返回乙個物件或者型別所佔的記憶體位元組數。
這裡的型別是指資料型別,比如int、long、陣列、指標、結構體等。
這裡的物件可以是變數、資料型別、函式呼叫。
記憶體位元組數**於儲存器中的概念。儲存器的容量是以位元組為基本單位的。也就是說乙個記憶體位址代表乙個位元組的儲存空間。
sizeof計算物件的大小也是轉換成對物件型別的計算,也就是說,同種型別的不同物件其sizeof值都是一致的。sizeof對乙個表示式求值,編譯器根據表示式的最終結果型別來確定大小,一般不會對表示式進行計算。
特別的,sizeof也可以對乙個函式呼叫求值,其結果是函式返回型別的大小,函式並不會被呼叫;函式、不能確定型別的表示式以及位域(bit-field)成員不能被計算sizeof值。
具體用法如下:
sizeof
(type_name)
;//sizeof(型別);
sizeof object;
//sizeof物件;
舉例說明:
int i;
sizeof
(i);
//ok
sizeof i;
//ok
sizeof
(int);
//ok
sizeof
int;
//error
下面依次舉例介紹部分資料型別和物件的具體應用。
這裡的基本資料型別指short、int、long、float、double這樣的簡單內建資料型別,由於它們都是和系統相關的,所以在不同的系統下取值可能不同。
一般的,在32位編譯環境中,sizeof(int)的取值為4。
指標變數,是指可以用來存放另乙個物件的位址的變數。指標變數裡面存放的是指標,即位址。在不同的系統中,位址的表示位數不同。如在32位系統中,位址是32位表示的。
當乙個位元組8位時,在32為系統中,說乙個儲存器的位址範圍一般是說 0x 00 00 00 00 ~ 0x 00 00 4f 00;而在16位系統中,位址是該範圍是說0x 00 00~ 0x 4f 00。
綜上,在32位計算機中,乙個指標變數的sizeof返回值通常是4,在64位系統中指標變數的sizeof的返回值通常為8。
指標變數的在c語言中的定義是為了為指向的物件預分配記憶體位址。指標變數的sizeof值與指標所指的物件沒有任何關係,所以同一系統中所有的指標變數所佔記憶體大小相等。
陣列的sizeof值等於陣列所占用的記憶體位元組數。
注意:字串陣列,最後乙個還有終止符。
結構體在記憶體中是按照一定的原則進行儲存的。
原則1:資料成員對齊規則:結構(struct或聯合union)的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍位址開始儲存)。
原則2:結構體作為成員:如果乙個結構裡有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍位址開始儲存。(struct a裡存有struct b,b裡有char,int,double等元素,那b應該從8的整數倍開始儲存。)
原則3:收尾工作:結構體的總大小,也就是sizeof的結果,必須是其內部最大成員的整數倍,不足的要補齊。
因此1 結構體sizeof的結果不是簡單的加所有成員的位元組數相加;
2 結構體sizeof的結果和不同資料型別在結構體中的位置有關;比如:
struct a
;
struct b
;
在32位作業系統中,sizeof(a)的結果是8;sizeof(a)的結果是12。
這是因為在記憶體中的儲存如下:
a b c
a的記憶體布局:1111, 1*, 11
b a c
b的記憶體布局:1***, 1111, 11**
其中,*表示補充。
對於其他一般的處理器,乙個記憶體位址是8位。但在dsp中,乙個記憶體位址不一定是8位。以ti的c2000為例,乙個記憶體位址是16位。
下圖為28033的記憶體對映圖:
圖中,乙個記憶體位址對應16位,以l0 saram為例,位址0x00 8000~0x00 8800,記憶體位址長度為0x800 = 2k,而乙個記憶體位址16位,所以l0 saram的儲存大小為2k x 16。
在ti的c2000中,使用sizeof得到結構體的記憶體位元組數,當結構體中只定義乙個uint16的變數時,sizeof的返回值為1;結構體中有乙個int32 和int16時,返回值為4。
如下:
struct
infoversion_p;
sizeof(infoversion_p)的結果是4。
struct
infoversion_p1;
sizeof(infoversion_p1)的結果是1。
dsp使用的是28033,該晶元乙個位址對應16位。因此結構體只有uint16乙個成員的時候,sizeof的返回值是1。
結構體在儲存的時候,記憶體對齊。因此,結構體中有乙個int32 和int16時,占用的是4個位址。所以sizeof的返回值是4。
要使用sizeof來返回結構體的記憶體位元組數時,定義的結構體最好按照32位,便於後期和其他人維護。
在查詢資料時發現,c2000中除了乙個位址對應16位是非常規的,還有關於char也是非常規的。char是16位的定義。
還是以28033為例,其使用的cpu如資料手冊所示:
使用編譯器甄別,分別給乙個char變數賦值16位和32為數值,賦值16為數值,編譯器正常無問題;賦值32為,編譯器報錯。所以,char確實是16位的。
sizeof 函式的使用
1.sizeof的使用 sizeof操作符以位元組形式給出了其運算元的儲存大小.sizeof操作符不能用於函式型別,不完全型別或位字段。不完全型別指具有未知儲存大小的資料型別,如未知儲存大小的陣列型別 未知內容的結構或聯合型別 void型別等。2.sizeof的結果 sizeof操作符的結果型別是s...
在C 中使用sizeof
在c 中使用sizeof c 類中有static靜態變數,virtual虛函式,還有繼承 派生等。sizeof是c語言的一種單目操作符,如c語言的其他操作符 等。它並不是函式。sizeof操作符以位元組形式給出了其運算元的儲存大小。sizeof使用形式有三種 sizeof var name 或siz...
sizeof的應用及其問題
1 sizeof應用在結構上的情況 請看下面的結構 struct mystruct 對結構mystruct採用sizeof會出現什麼結果呢?sizeof mystruct 為多少呢?也許你會這樣求 sizeof mystruct sizeof double sizeof char sizeof in...