sizeof求位元組以及與strlen的區別

2021-09-06 21:34:31 字數 3565 閱讀 8898

例子一:

/*

*根據以下條件進行計算:

*1、 結構體的大小等於結構體內最大成員大小的整數倍

*2、 結構體內的成員的首位址相對於結構體首位址的偏移量是其型別大小的整數倍,比如說double型成員相對於結構體的首位址的位址

*偏移量應該是8的倍數。

*/#include

#include

using

namespace

std;

classaa;

classbb;

struct

a;struct

b;int

main()

其中,aa中,a佔4個位元組,b本應佔2個位元組,但由於c佔4個位元組,為了滿足條件2,b多占用2個位元組,為了滿足條件1,d占用4個位元組,一共16個位元組。

bb中,a佔8個位元組,b佔2個位元組,但由於c佔4個位元組,為了滿足條件2,b多占用2個位元組,

即abc共占用8+4+4=16個位元組,

為了滿足條件1,d將占用8個位元組,一共24個位元組。

例子二:

#include#include

using

namespace

std;

class

a{};

class

a2;class

b;struct

c;struct

d;int

main()

例子三:

1)類內部的成員變數:

普遍的變數:是要占用記憶體的,但是要注意記憶體對齊(這點和struct型別很相似)

static修飾的靜態變數:不占用記憶體,原因是編譯器將其放在全域性變數區

2)類內部的成員函式

非虛函式(建構函式、static函式、成員函式等):不占用記憶體

構成物件本身的只是資料,任何成員函式都不隸屬於任何乙個物件,非靜態成員函式與物件的關係就是繫結,繫結的中介就是this指標。成員函式為該類的物件共享,不僅是處於簡化語言實現、節省儲存的目的,而且是為了使同類物件由一致的行為。同類物件的行為雖然一致,但是操作不同的資料成員。

#includeusing

namespace

std;

classa1;

classa2;

classa3;

classa4;

classa5;

intmain()

存在父類和子類以及虛繼承時,sizeof的大小

總結: 例如:

#include#include

#include

using

namespace

std;

class

a;class

a2{};

class b:public

a{};

class c:public

virtual

b{};

class d:public a,public

a2{};

intmain()

輸出:

sizeof與strlen之間的區別:

例子一:

char *ss="0123456789";

sizeof(ss)結果為4,ss是指向字串常量的字元陣列。

sizeof(*ss)結果是1,*ss是第乙個字元

例子二:

char ss="0123456789";

sizeof(ss)結果為11,ss是陣列,計算到'\0'位置,因此是(10+1)。

sizeof(*ss)結果是1,*ss是第乙個字元

例子三:

char ss[100]="0123456789";

sizeof(ss)結果是100,ss表示在記憶體中預分配的大小,100*1。

strlen(ss)結果是10,它的內部實現是用乙個迴圈計算字串的長度,直到'\0'為止,並且不包含'\0'。

例子四:

int ss[100]="0123456789";

sizeof(ss)結果是400,ss表示在記憶體中的大小,100*4。

strlen(ss)錯誤,strlen的引數只能是char*,且必須是以'\0'結尾的。

例子五:

class x

int i;

int j;

char k;

x x;

cout

1)sizeof操作符的結構型別是size_t,它在標頭檔案中的typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。

2)sizeof是操作符,strlen是函式

3)sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以'\0'結尾的。sizeof還可以用函式做引數,比如:

short f();

printf("%d\n",sizeof(f()));

輸出的結果是sizeof(short),即2

4)陣列做sizeof的引數不退化,傳遞給strlen就退化為指標。

5)大部分編譯程式在編譯的時候就把sizeof計算過了,是型別或是變數的長度。這就是sizeof(x)可以用來定義陣列維數的原因:

char str[20]="0123456789";

int a=strlen(str);  //a=10;

int b=sizeof(str);  //而b=20;

6)strlen的結果要在執行的時候才能計算出來,用來計算字串的長度,而不是型別佔記憶體的大小。

7)sizeof後如果是型別必須加括號,如果是變數名可以不加括號。這是因為sizeof是個操作符而不是函式。

8)當使用乙個結構型別或變數時,sizeof返回時實際的大小。當使用靜態的陣列空間時,sizeof返回全部陣列的尺寸。sizeof操作符不能返回被動態分配的陣列或外部的陣列的尺寸。

9)陣列作為引數傳給函式時傳的是指標而不是陣列,傳遞的是陣列的首位址,如:fun(char [8]),fun(char)都等價於fun(char*)。在c++裡傳遞陣列永遠都是傳遞指向陣列首元素的指標,編譯器不知道陣列的大小。如果想在函式內知道陣列的大小,需要這樣做:進入函式後用memcpy將陣列拷貝出來,長度由另乙個形參傳進去。**如下:

fun (unsigned char *p1,int
len)

10)計算結構變數的大小就必須討論資料對齊問題。為了使cpu訪問的速度最快,c++在處理資料時經常把結構變數中的成員的大小按照4或8的倍數計算,這就叫資料對齊。

11)sizeof操作符不能用於函式型別、不完全型別或位字段。不完全型別指具有未知儲存大小資料的資料型別,如未儲存大小的陣列型別、未知內容的結構或聯合型別、void型別等。

sizeof對於指標,求出的是指標的大小,如果運算元是函式中的陣列形參或函式型別的形參,sizeof給出其指標的大小。

例如:char var[10];

int test(char var)

return sizeof(var);

位元組對齊與sizeof

本文主要包括二個部分,第一部分重點介紹在vc中,怎麼樣採用sizeof來求結構的大小,以及容易出現的問題,並給出解決問題的方法,第二部分總結出vc中sizeof的主要用法。1 sizeof應用在結構上的情況 請看下面的結構 struct mystruct 對結構mystruct採用sizeof會出現...

sizeof 與 位元組對齊

sizeof是運算子,可用於任何變數名 型別名或常量值,當用於變數名 不是陣列名 或常量時,它不需要用圓括號。它在編譯時起作用,而不是執行時。這是初學者問得最多的乙個問題,所以這裡有必要多費點筆墨。讓我們先看乙個結構體 struct s1 問sizeof s1 等於多少聰明的你開始思考了,char佔...

C 位元組 sizeof 與指標

定義 sizeof是乙個操作符 operator 其作用是返回乙個物件或型別所佔的記憶體位元組數 結構體的sizeof 需要考慮位元組對齊問題。為什麼需要位元組對齊?從效能上看 有助於加快計算機的取數速度,否則就得多花指令週期了。從硬體上看 不是所有硬體都能讀取任意位置的資料。為此,編譯器缺省會對結...