說起sizeof,想來大家都不陌生,她是用來計算資料所佔記憶體空間位元組數的乙個操作符。
但是,很多人,尤其是初學者,甚至我的同事中一些已經開發過一段時間的程式設計人員對於這個操作符的使用都存在不少理解上的失誤。
今天,我就簡單分享一些我個人的使用心得,不是什麼了不起的東西,畢竟本人也只能算是程式設計界的菜鳥一枚,但是希望能對初學者們有些幫助。
首先,對於做乙個簡單的sizeof常數彙總,如下:
sizeof int:4
sizeof short:2
sizeof long:4
sizeof float:4
sizeof double:8
sizeof char:1
sizeof *p:4
sizeof word:2
sizeof dword:4
然後,關於sizeof有乙個使用注意點:
string str = "abcde";
sizeof(str)得到的是string類的大小,用sizeof(str.c_str())或者sizeof(str.data())將string型別轉換成char*才能獲取到這個字串的值。
下面說一說指標,關於指標有個經典例項,都是老生長談啦:
經典問題:
double* (*a)[3][6];
cout<
問題解析:a是乙個很奇怪的定義,他表示乙個指向
double*[3][6]
型別陣列的指標。既然是指標,所以
sizeof(a)就是4
。既然a是執行
double*[3][6]
型別的指標,
*a就表示乙個
double*[3][6]
的多維陣列型別,因此
sizeof(*a)=3*6*sizeof(double*)=72
。同樣的,
**a表示乙個
double*[6]
型別的陣列,所以
sizeof(**a)=6*sizeof
(double*)=24
。***a
就表示其中的乙個元素,也就是
double*
了,所以
sizeof(***a)=4
。至於****a
,就是乙個
double
了,所以
sizeof(****a)=sizeof(double)=8
。這個是本人直接從網上拷貝的,實際上,這個我本人並不想多說,都是關於指標需要掌握的知識,也沒人會這麼用。不過關於指標,我個人倒是的確有乙個注意點要提一提:
比如說:char* p;sizeof(p)的結果是4,sizeof(*p)相當於sizeof(char)的結果是1;當然,這不是重點,我要說的重點在於陣列。是的,陣列才是我要提的注意點。
通常情況下,如int a[16];char b = "abcde";等等來說,我們可以將這些陣列看作是固定大小的指標來使用,但是,在使用sizeof(a)、sizeof(b)時,我們實際上取得的是這些「靜態陣列」的值,也就是說sizeof(a) = 16;sizeof(b) = 6;
只有當陣列作為形參,沒有固定分配記憶體時,sizeof這個陣列的值才會按照指標計算為4位元組。
最後,我要講一講今天的重頭戲,也是在使用sizeof最容易出錯的地方,struct。
我先不說其他,大家先看看以下的幾個struct所佔的位元組數應該是多少。
struct a1
;struct a2
;struct a3
;struct a4
;struct a5
;各位,想好了沒?
想好了我可公布答案啦:
sizeof(a1) == 16;
sizeof(a2) == 24;
sizeof(a3) ==16;
sizeof(a4) == 24;
sizeof(a5) == 20;
各位看客,能想清楚不?
這裡我寫一下我對在struct中使用sizeof的理解:在struct中用sizeof取值時,在未通過類似#pragma pack(1)來關閉記憶體對齊時,編譯器在編譯時,對於結構體,總會分配乙個該結構體中占用位元組數最多的型別所占用記憶體的整數倍的記憶體。而且,這種分配方式,我取了乙個名字叫做「記憶體分割」。這麼意思呢?
以a1、a2為例,兩者中的變數看似都是一樣的,但是編譯器按照順序分配記憶體時,a1在分配char,char,int時,按照最長位元組數8來分配並沒有填充滿,所以只佔8個位元組,加上double 佔的8個位元組一共16個位元組。而對於a2而言,在分配到第二個double時,已經超出了8個位元組,所以第乙個char 佔了8個位元組,第二個double 佔了8個位元組,最後兩個數占了8個位元組,所以一共佔了24個位元組。
而下面有同學就問了,為啥sizeof(a4)和sizeof(a5)的值不一樣啊,而且為什麼不是16的倍數呢?a1和a3的sizeof值不都是16嘛?
這裡就又是另乙個坑了,編譯器在做記憶體對齊的時候,如果struct內部有另乙個struct時,她比較的是struct中對齊所用的那個值,所以a1對齊用的值是8個位元組,a3對齊用的是4個位元組,所以a4和a5的值就不一樣了。
好了,以上就是本人對於sizeof的一些淺見,如果有什麼不對的地方,希望各位大神指點。
react redux 個人基本配置 使用心得
redux 個人心得 第一步 在index.js 裡面 importreact from react importfrom react dom importfrom react redux importconfigurestore from store configurestore 這個檔案裡面其實...
Git專案管理使用心得(個人筆記)
git分支管理模式如下 註解 git主要分master dev這兩個分支。1 master分支用於儲存線上穩定 可執行 自以為無bug的 最新版本!2 dev分支用於開發人員日常 合併更新,為避免各自 需求 分支在完成之後合併導致大量衝突 建議每天上班pull 下班push 保持 dev分支 和 自...
fastjson的使用心得
這個的使用很簡單,但今天下午犯二搞了很久,整理下 以免下次犯同樣的錯 1 錯誤 對json的格式想當然了 描述 json 字串拼錯了,造成怎麼解析都不對 下面是錯誤的示範 name jack psd piao city name name 就是在陣列中定義的時候錯了,乙個很2 的錯誤,今天搞的頭大 ...