亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

sizeof

Original 2016-11-08 10:26:29 777
abstract:一、sizeof使用的場(chǎng)合:1、sizeof操作符的一個(gè)主要用途是與存儲(chǔ)分配和I/O系統(tǒng)那樣的例程進(jìn)行通信。例如: void* malloc(size_t size);  size_t fread(void *ptr, size_t size, size_t nmemb, FILE*&nb

一、sizeof使用的場(chǎng)合:

1、sizeof操作符的一個(gè)主要用途是與存儲(chǔ)分配和I/O系統(tǒng)那樣的例程進(jìn)行通信。例如:

 void* malloc(size_t size);
 size_t fread(void *ptr, size_t size, size_t nmemb, FILE* stream)

2、用它可以看看某種類型的對(duì)象在內(nèi)存中所占的單元字節(jié)。例如:

void *memset(void *s, int c, sizeof(s));

3、在動(dòng)態(tài)分配一對(duì)象時(shí),可以讓系統(tǒng)知道要分配多少內(nèi)存。

4、便于一些類型的擴(kuò)充。在windows中很多結(jié)構(gòu)類型就有一個(gè)專用的字段用來(lái)存放該類型的字節(jié)大小。

5、由于操作數(shù)的字節(jié)數(shù)在實(shí)現(xiàn)時(shí)可能出現(xiàn)變化,建議在涉及操作數(shù)字節(jié)大小時(shí)用sizeof代替常量計(jì)算。

6、如果操作數(shù)就是函數(shù)中的數(shù)組形參或函數(shù)類型的形參,sizeof給出其指針的大小。

二、sizeof不能使用的場(chǎng)合:

sizeof操作符不能用于函數(shù)類型,不完全類型或位字段。不完全類型指具有未知存儲(chǔ)大小的數(shù)據(jù)類型,如未知存儲(chǔ)大小的數(shù)組類型、未知內(nèi)容的結(jié)構(gòu)或聯(lián)合類型等。

三、

cout<<sizeof(string*)<<endl; // 4
cout<<sizeof(int*)<<endl; // 4
cout<<sizof(char****)<<endl; // 4

int f();
cout << sizeof(f) << endl;  //編譯錯(cuò)誤
cout << sizeof(f()) << endl; //4

int a=6;
cout << sizeof(a=8) << endl;  //輸出4,
cout << a << endl;   //輸出6。sizeof只是個(gè)運(yùn)算符,所以相當(dāng)于符號(hào)替換,a=8被替換成int,并不會(huì)修改a的值。

四、

#include <iostream>
using namespace std;

int Sum(int i[]) {
    int sumofi = 0;
    for (int j = 0; j < sizeof(i)/sizeof(int); j++)   //實(shí)際上,sizeof(i) = 4這里數(shù)組名在形參作為指針
       sumofi += i[j];
    return sumofi;
}

int main() {
    int allAges[6] = {21, 22, 22, 19, 34, 12};
    cout<<Sum(allAges)<<endl;
     return 0;
}

Sum的本意是用sizeof得到數(shù)組的大小,然后求和。但是實(shí)際上,傳入自函數(shù)Sum的,只是一個(gè)int 類型的指針,所以sizeof(i)=4,而不是24,所以會(huì)產(chǎn)生錯(cuò)誤的結(jié)果。解決這個(gè)問(wèn)題的方法使是用指針或者引用。一般求數(shù)組的長(zhǎng)度我們會(huì)習(xí)慣用函數(shù)模板。這個(gè)可以參考文章《函數(shù)模板》。

 五、 

double* (*a)[3][6]; 
 cout<<sizeof(a)<<endl; // 4 a為指針
 cout<<sizeof(*a)<<endl; // 72 *a為一個(gè)有3*6個(gè)指針元素的數(shù)組
 cout<<sizeof(**a)<<endl; // 24 **a為數(shù)組一維的6個(gè)指針
 cout<<sizeof(***a)<<endl; // 4 ***a為一維的第一個(gè)指針
 cout<<sizeof(****a)<<endl; // 8 ****a為一個(gè)double變量

解析:a是一個(gè)很奇怪的定義,他表示一個(gè)指向double*[3][6]類型數(shù)組的指針。既然是指針,所以sizeof(a)就是4。 既然a是執(zhí)行double*[3][6]類型的指針,*a就表示一個(gè)double*[3][6]的多維數(shù)組類型,因此sizeof(*a)=3*6*sizeof(double*)=72。同樣的,**a表示一個(gè)double*[6]類型的數(shù)組,所以sizeof(**a)=6*sizeof  (double*)=24。***a就表示其中的一個(gè)元素,也就是double*了,所以sizeof(***a)=4。至于****a,就是一個(gè)double了,所以sizeof(****a)=sizeof(double)=8。 

六、sizeof(class)空類的大小為1,其他跟struct差不多,可以參見(jiàn)《字節(jié)對(duì)齊詳解》里面的內(nèi)容。需要指出的是class里面的virtual函數(shù)是獨(dú)立開(kāi)來(lái)的,virtual代表的是一個(gè)虛函數(shù)指針,它是一個(gè)虛函數(shù)表的地址入口。例如:

 class classB {
2     char a;
3     // double b;
4     // int c;
5     virtual func1(){} 
6 };

因?yàn)樘摵瘮?shù)指針占了四個(gè)字節(jié),char占了一個(gè)字節(jié),安照對(duì)齊原則,sizeof(classB)=8, 如果去掉注釋int c,那就變成了12. 但,注意如果現(xiàn)在注釋int c,而去掉double b的注釋,guess what's it? 按一般來(lái)說(shuō),應(yīng)該是16,一個(gè)double加char和一個(gè)指針,補(bǔ)足16位,但實(shí)際上是24,因?yàn)橹羔樖菃为?dú)拿出來(lái)算了,這就變成了double,加上char補(bǔ)足的八位,加上指針補(bǔ)足的八位,一共是24個(gè)字節(jié)了。


Release Notes

Popular Entries