C 位元組 sizeof 與指標

2021-09-25 06:59:56 字數 2933 閱讀 9238

定義: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)

cout<<

"char n "

<<

sizeof

(n)

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 千萬不要把陣列名看成指標,儘管有些時候他們是相通的,但也僅限某些...