定義:sizeof是乙個操作符(operator)。其作用是返回乙個物件或型別所佔的記憶體位元組數
結構體的sizeof:
需要考慮位元組對齊問題。
為什麼需要位元組對齊?
從效能上看:有助於加快計算機的取數速度,否則就得多花指令週期了。
從硬體上看:不是所有硬體都能讀取任意位置的資料。
為此,編譯器缺省會對結構體進行處理(實際上其它地方的資料變數也是如此),讓寬度為2的基本資料型別(short等)都位於能被2整除的位址上,讓寬度為4的基本資料型別(int等)都位於能被4整除的位址上,依次類推。這樣,兩個數中間就可能需要加入填充位元組,所以整個結構體的sizeof值就增長了。
1) 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除。
2) 結構體的每個成員相對於結構體首位址的偏移量(offset)都是成員大小的整數倍,如有需要,編譯器會在成員之間加上填充位元組(internal adding)。
3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要,編譯器會在最末乙個成員後加上填充位元組(trailing padding)。
struct s1
;sizeof
(s1)
;//值為8,位元組對齊,在char之後會填充3個位元組。
struct s2
;sizeof
(s2)
;//值為8,位元組對齊,在char之後會填充3個位元組。
struct s3
;sizeof
(s3)
;//值為1,空結構體也佔記憶體
注意:空結構體(不含資料成員)的sizeof值為1。試想乙個「不佔空間「的變數如何被取位址、兩個不同的「空結構體」變數又如何得以區分呢,於是,「空結構體」變數也得被儲存,這樣編譯器也就只能為其分配乙個位元組的空間用於佔位了。
聯合體的sizeof:
結構體在記憶體組織上市順序式的,聯合體則是重疊式,各成員共享一段記憶體;所以整個聯合體的sizeof也就是每個成員sizeof的最大值。
陣列的sizeof:
陣列的sizeof值等於陣列所占用的記憶體位元組數。
注意:1)當字元陣列表示字串時,其sizeof值將』/0』計算進去。
2)當陣列為形參時,其sizeof值相當於指標的sizeof值
char a[10]
;char n=
"abc"
;
cout<<
"char a[10]"
<<
sizeof
(a)/陣列,值為10
cout<<
"char n "
<<
sizeof
(n)/字串陣列,將'/0'計算進去,值為4
void
func
(char a[3]
)void
funcn
(char b)
指標的sizeof:
指標是用來記錄另乙個物件的位址,所以指標的記憶體大小當然就等於計算機內部位址匯流排的寬度。
在32位計算機中,乙個指標變數的返回值必定是4。
指標變數的sizeof 值與指標所指的物件沒有任何關係。
函式的sizeof:
sizeof也可對乙個函式呼叫求值,其結果是函式返回值型別的大小,函式並不會被呼叫。
對函式求值的形式:sizeof (函式名(實參表))
注意:1)不可以對返回值型別為空的函式求值。
2)不可以對函式名求值。
3)對有引數的函式,在用sizeof 時,須寫上實參表。
#include
using
namespace std;
float
funcp
(int a,
float b)
intfuncnp()
void
func()
intmain()
不同型別的指標自增,自減或加減任意值,會造成不同的移動;
因為指標的移動,其實質是移動乙個單元(如乙個int型資料或乙個char型資料)。
如:char型指標p,p++等於右移1個位元組;
int型指標p,p++等於右移4個位元組;
float型指標p,p++等於右移4個位元組;
double型指標p,p++等於右移8個位元組;
注意轉化為何種型別,根據轉化後的型別來判斷其將要移動多少個位元組或單元。
char str=
"glad to test something"
;char
*p = str;
p++;
//右移1位,指向l
int*p1 =
reinterpret_cast
<
int*
>
(p);
//轉化為int型
p1++
;//右移1位,int型,移動四個位元組;應是指向t
p =reinterpret_cast
<
char
*>
(p1)
;//轉化為char
printf
("result is %s\n"
, p)
;
故而輸出:
result is to test something
位元組對齊與sizeof
本文主要包括二個部分,第一部分重點介紹在vc中,怎麼樣採用sizeof來求結構的大小,以及容易出現的問題,並給出解決問題的方法,第二部分總結出vc中sizeof的主要用法。1 sizeof應用在結構上的情況 請看下面的結構 struct mystruct 對結構mystruct採用sizeof會出現...
sizeof 與 位元組對齊
sizeof是運算子,可用於任何變數名 型別名或常量值,當用於變數名 不是陣列名 或常量時,它不需要用圓括號。它在編譯時起作用,而不是執行時。這是初學者問得最多的乙個問題,所以這裡有必要多費點筆墨。讓我們先看乙個結構體 struct s1 問sizeof s1 等於多少聰明的你開始思考了,char佔...
sizeof 陣列與指標
注 本文摘自csdn論壇的乙個回帖,個人覺得看完之後豁然開朗,於是轉貼於此。位址為 http topic.csdn.net u 20081016 23 6b46dc63 b0d7 4dad 806f e8cd48a2208b.html 千萬不要把陣列名看成指標,儘管有些時候他們是相通的,但也僅限某些...