您好,登錄后才能下訂單哦!
Sizeof是c/c++中的關鍵字,它是一個運算符,其作用是取得一個對象(數據類型或數據對象)的長度(即占用內存的大小,以byte為單位)。其中類型包括基本數據類型(不包括void)、用戶自定義類型(結構體、類)、函數類型。數據對象是指用前面提到的類型定義的普通變量和指針變量(包含void指針)。
十大特性:
特性0:sizeof是運算符,不是函數;
特性1:sizeof不能求void類型的長度;
特性2:sizeof能求void類型的指針的長度;
其實指針也是變量,只不過這個變量很特殊,它是存放其它變量地址的變量,目前32位計算機平臺下的指針變量的大小為4。
特性3:sizeof能求得靜態分配內存的數組的長度;
注意:用sizeof求字符串的長度時要加上末尾的‘/0’。
例:
void fun(int array[10])
{
int n = sizeof(array);
}
編輯程序:
#include<iostream>
using namespace std;
int fun(int array[10])
{
int n = sizeof(array);
return n;
}
int main()
{
int ret;
int array[10] = { 0 };
ret = fun(array);
cout << ret << endl;
system("pause");
return 0;
}
運行結果:
4
請按任意鍵繼續. . .
在fun類n的值為4,而不是40,這是因為在函數參數傳遞時,數組被轉化成指針了,假如直接傳遞整個數組的話,那么必然涉及到數組元素的拷貝(實參到形參的拷貝),當數組非常大時,會導致函數執行效率極低,而只傳遞數組的地址(即指針),只需要拷貝4byte。
特性4:sizeof不能求動態分配的內存的大小;
特性5:sizeof不能對不完整的數組求長度,否則會編譯出錯;
特性6:當表達式作為sizeof的操作數時,它返回的是表達式計算結果的類型大小,但是它不對表達式求值;
例:程序:
#include<iostream>
using namespace std;
int main()
{
char ch = 1;
int num = 1;
int n1 = sizeof(ch + num);
int n2 = sizeof(ch = ch + num);
cout << "n1=" << n1 << endl;
cout << "n2=" << n2 << endl;
system("pause");
return 0;
}
結果:
n1=4
n2=1
請按任意鍵繼續. . .
由于默認類型轉換的原因,表達式ch + num的計算結果類型為int,因此n1=4;而ch=ch + num的計算結果為char,雖然在計算ch + num時結果為int,當把結果賦給ch時又進行了類型轉換,因此表達式的最終類型還是char,故n2=1。
特性7:sizeof可以對函數調用求大小,并且求得的大小等于返回類型(函數類型)的大小,但是不執行函數體;
特性8:sizeof求得的結構體(及其對象)的大小并不等于各個數據成員對象的大小之和;
規則:
a.結構體的大小等于結構體內最大成員大小的整數倍;
b.結構體內的成員的首地址相對于結構體的首地址的偏移量是其類型的整數倍,比如說double型成員相對于結構體的首地址的地址偏移量應該是8的倍數;
c.為了滿足規則1和2,編譯器會在結構體成員之后進行字節填充;
例:程序:
#include<iostream>
using namespace std;
int main()
{
struct A
{
int num1 = 0;
int num2 = 0;
double num3 = 0;
};
struct B
{
int n1 = 0;
double n2 = 0;
int n3 = 0;
};
cout << "A=" << sizeof(A) << endl;
cout << "B=" << sizeof(B) << endl;
system("pause");
return 0;
}
結果:
A=16
B=24
請按任意鍵繼續. . .
sizeof(A):4+4+8=16
sizeof(B):4(n1占用地址空間:0,1,2,3)+4(不夠8的倍數填充4個地址空間,4,5,6,7)+8(n2占用地址空間:8-15)+4(n3占用地址空間:16-19)+4(不夠8的倍數填充4個,20,21,22,23)=24。
特性9:sizeof不能用于求結構體的位域成員的大小,但是可以求得包含位域成員的結構體的大小。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。