亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

深入理解sizeof

2019-11-17 05:05:42
字體:
來源:轉載
供稿:網友
  最近在論壇里總有人問關于sizeof的問題,并且本人對這個問題也一直沒有得到很好的解決,索性今天對它來個較為具體的總結,同時結合strlen進行比較,假如能對大家有點點幫助,這是我最大的欣慰了。


一、好首先看看sizeof和strlen在MSDN上的定義:

首先看一MSDN上如何對sizeof進行定義的:sizeof Operatorsizeof eXPRessionThe sizeof keyWord gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.The expression is either an identifier or a type-cast expression (a type specifier enclosed in parentheses).When applied to a strUCture type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment. When applied to a statically dimensioned array, sizeof returns the size of the entire array. The sizeof operator cannot return the size of dynamically allocated arrays or external arrays.然后再看一下對strlen是如何定義的: strlenGet the length of a string.Routine Required Header:strlen <string.h>size_t strlen( const char *string );Parameterstring:Null-terminated string LibrariesAll versions of the C run-time libraries.Return ValueEach of these functions returns the number of characters in string, excluding the terminal NULL. No return value is reserved to indicate an error.RemarksEach of these functions returns the number of characters in string, not including the terminating null character. wcslen is a wide-character version of strlen; the argument of wcslen is a wide-character string. wcslen and strlen behave identically otherwise.二、由幾個例子說開去。

第一個例子: char* ss = "0123456789";sizeof(ss) 結果 4 ===》ss是指向字符串常量的字符指針sizeof(*ss) 結果 1 ===》*ss是第一個字符char ss[] = "0123456789";sizeof(ss) 結果 11 ===》ss是數組,計算到////////////////0位置,因此是10+1sizeof(*ss) 結果 1 ===》*ss是第一個字符char ss[100] = "0123456789";sizeof(ss) 結果是100 ===》ss表示在內存中的大小 100×1strlen(ss) 結果是10 ===》strlen是個函數內部實現是用一個循環計算到////////////////0為止之前int ss[100] = "0123456789";sizeof(ss) 結果 400 ===》ss表示再內存中的大小 100×4strlen(ss) 錯誤 ===》strlen的參數只能是char* 且必須是以///////////////'///////////////'////////////////0///////////////'///////////////'結尾的char q[]="abc";char p[]="a////////////////n";sizeof(q),sizeof(p),strlen(q),strlen(p);結果是 4 3 3 2 第二個例子:class X{int i;int j;char k;};X x;cout<<sizeof(X)<<endl; 結果 12 ===》內存補齊cout<<sizeof(x)<<endl; 結果 12 同上
第三個例子:char szPath[MAX_PATH]  假如在函數內這樣定義,那么sizeof(szPath)將會是MAX_PATH,但是將szPath作為虛參聲明時(void fun(char szPath[MAX_PATH])),sizeof(szPath)卻會是4(指針大小)

三、sizeof深入理解。
  • 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(unsiged char *p1, int len){ unsigned char* buf = new unsigned char[len+1] memcpy(buf, p1, len);}有關內容見: C++ PRIMER?
  • 10.計算結構變量的大小就必須討論數據對齊問題。為了CPU存取的速度最快(這同CPU取數操作有關,具體的介紹可以參考一些計算機原理方面的書),C++在處理數據時經常把結構變量中的成員的大小按照4或8的倍數計算,這就叫數據對齊(data alignment)。這樣做可能會浪費一些內存,但理論上速度快了。當然這樣的設置會在讀寫一些別的應用程序生成的數據文件或交換數據時帶來不便。MS VC++中的對齊設定,有時候sizeof得到的與實際不等。一般在VC++中加上#pragma pack(n)的設定即可.或者假如要按字節存儲,而不進行數據對齊,可以在Options對話框中修改Advanced compiler頁中的Data alignment為按字節對齊。
  • 11.sizeof操作符不能用于函數類型,不完全類型或位字段。不完全類型指具有未知存儲大小的數據類型,如未知存儲大小的數組類型、未知內容的結構或聯合類型、void類型等。如sizeof(max)若此時變量max定義為int max(),sizeof(char_v) 若此時char_v定義為char char_v [MAX]且MAX未知,sizeof(void)都不是正確形式
四、結束語

sizeof使用場合。
  • 1.sizeof操作符的一個主要用途是與存儲分配和I/O系統那樣的例程進行通信。例如:    void *malloc(size_t size),   size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。
  • 2.用它可以看看一類型的對象在內存中所占的單元字節。 void * memset(void * s,int c,sizeof(s))
  • 3.在動態分配一對象時,可以讓系統知道要分配多少內存。
  • 4.便于一些類型的擴充,在windows中就有很多結構內型就有一個專用的字段是用來放該類型的字節大小。
  • 5.由于操作數的字節數在實現時可能出現變化,建議在涉及到操作數字節大小時用sizeof來代替常量計算。
  • 6.假如操作數是函數中的數組形參或函數類型的形參,sizeof給出其指針的大小。
·本文要害字:程序設計 / C++ / 基礎教程

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产va另类| www.日韩.com| 色综合久久精品亚洲国产| 曰本色欧美视频在线| 国产有码在线一区二区视频| 黑人精品xxx一区一二区| 午夜精品在线观看| 蜜臀久久99精品久久久久久宅男| 欧美精品www在线观看| 大胆人体色综合| 久久精品视频网站| 亚洲影院在线看| 成人久久一区二区三区| 九九久久久久99精品| 精品国产91久久久| 日韩动漫免费观看电视剧高清| 亲爱的老师9免费观看全集电视剧| 国产精品直播网红| 久久夜精品香蕉| 亚洲毛片在线观看.| 亚洲sss综合天堂久久| 久久视频中文字幕| 国产精品成人免费视频| 97超级碰碰碰久久久| 琪琪第一精品导航| 国产999精品视频| 色婷婷综合久久久久| 亚洲一区二区日本| 欧美性高潮床叫视频| 国自在线精品视频| xvideos国产精品| 大量国产精品视频| 91亚洲国产成人精品性色| 亚洲成人性视频| 欧美视频在线免费看| 亚洲欧美国产精品va在线观看| 欧美一区深夜视频| 欧美视频中文字幕在线| 国产精品视频一区二区高潮| 欧美精品免费看| 日韩免费不卡av| 91久久精品一区| 国产91ⅴ在线精品免费观看| 菠萝蜜影院一区二区免费| 韩国福利视频一区| 亚洲国产精久久久久久久| 2019亚洲日韩新视频| 久久精品久久久久久| 一区二区三区高清国产| 精品一区电影国产| 91sa在线看| 日韩精品视频中文在线观看| 久久久久久一区二区三区| 成人福利视频网| 国产va免费精品高清在线观看| 日韩av在线网站| 日韩在线中文字幕| 91精品国产自产91精品| 一区二区欧美久久| 在线播放国产一区二区三区| 成人羞羞国产免费| 久久夜精品va视频免费观看| 欧美视频免费在线| 中文字幕精品久久| 久久精品视频导航| 日本精品视频网站| 久久综合国产精品台湾中文娱乐网| 久久资源免费视频| 色偷偷88888欧美精品久久久| 欧美高清在线视频观看不卡| 成人h猎奇视频网站| 91精品国产高清久久久久久91| 欧美午夜精品伦理| 中文字幕国产精品久久| 久久欧美在线电影| 亚洲精品999| 中文字幕日本精品| 国产亚洲成av人片在线观看桃| 久久99热精品| 精品久久久久人成| 久久久综合免费视频| 久久久在线免费观看| 国语自产精品视频在免费| 久久久久久亚洲精品不卡| 国外成人在线视频| 亚洲精品在线不卡| 中文字幕最新精品| 韩国精品美女www爽爽爽视频| 欧美激情第99页| 亚洲精品国产免费| 国产视频精品免费播放| 欧美美女18p| 欧美一级黑人aaaaaaa做受| 欧洲亚洲免费在线| 国产成人在线播放| 狠狠躁夜夜躁人人爽超碰91| 国产热re99久久6国产精品| www.午夜精品| 日韩午夜在线视频| 亚洲精品乱码久久久久久按摩观| 欧美激情国产日韩精品一区18| 国产欧美精品xxxx另类| 国产亚洲一区精品| 日韩精品视频中文在线观看| 国产精品一区二区三区久久久| 日韩av免费看网站| 国产精品久久一| 1769国产精品| 日韩中文在线中文网在线观看| 91国语精品自产拍在线观看性色| 日韩免费观看在线观看| 一区二区在线免费视频| 91久久国产精品| 国产aⅴ夜夜欢一区二区三区| 久久久久久国产精品| 韩国精品美女www爽爽爽视频| 国产一区二区三区中文| 性色av一区二区咪爱| 国内揄拍国内精品少妇国语| 91av在线精品| 一区二区在线视频| 精品人伦一区二区三区蜜桃网站| 国产一区视频在线播放| 中文字幕欧美精品在线| 激情久久av一区av二区av三区| 日韩国产欧美区| 精品国内产的精品视频在线观看| 国产综合色香蕉精品| 国产+人+亚洲| 国产精品美女久久久久av超清| 亚洲成av人乱码色午夜| 国产v综合ⅴ日韩v欧美大片| 理论片在线不卡免费观看| 亚洲精品网站在线播放gif| 午夜欧美不卡精品aaaaa| 欧美性受xxxx白人性爽| 日韩亚洲成人av在线| 国产精品美乳一区二区免费| 久久精品成人欧美大片古装| 上原亚衣av一区二区三区| 国产精品黄视频| 欧美精品手机在线| 亚洲黄色av女优在线观看| 中文字幕在线看视频国产欧美| 亚洲午夜未满十八勿入免费观看全集| 中文字幕欧美精品日韩中文字幕| 8050国产精品久久久久久| 亚洲永久免费观看| 欧美成人小视频| 日韩av综合网| 日韩一区二区精品视频| 亚洲最大av网站| 国产丝袜高跟一区| 成人午夜高潮视频| 2019中文字幕在线| 性欧美亚洲xxxx乳在线观看| 668精品在线视频| 亚洲深夜福利视频| 国产一区二区三区免费视频| 欧美黄色成人网| 国产不卡精品视男人的天堂| 欧美国产精品va在线观看| 亚洲第一av网站| 亚洲va久久久噜噜噜久久天堂|