C 的 sizeof 是怎麼實現的?

時間 2021-05-31 19:56:41

1樓:ddlau

1、b應該等於sizeof( std::ptrdiff_t ),通常這個值是4或者8;

2、姑且不說實現,C++標準要求不對用作sizeof、alignof、decltype、typeid、noexcept運算元的表示式求值;

我剛才說的noexcept不是noexcept specification,而是noexcept operator;

2樓:小明不聽話

看到「深入理解 sizeof 」,我只能呵呵。 sizeof 也需要深入? 如果要深入那也是 c/c++ 的型別系統, sizeof 真的是「短的不能再短」了。

sizeof 是乙個運算子,編譯期求乙個型別sizeof(int) 或是乙個表示式 size(++i) 的型別的長度!

重點: (1) 運算子,非函式; (2) 編譯期求值,所以 sizeof 的結果是常量; (3) 求的是型別的長度,表示式是不需要求值的!

sizeof(4) == sizeof(i) == sizeof(++i) == 4 ,為什麼是 4! 因為(某編譯器)一開始就規定的 int 是 4 個位元組呀,混蛋!

補充:(4) c/c++ 識別符號先宣告後使用 + 靜態型別意味著: 任何乙個表示式 (*p++)[0]->a 本身從宣告和解析上就能知道型別,不需要計算出結果才知道呀,哎喲喂!!

所以回到題目的問題:

第2個問題: sizeof(++i) 中 i 值為什麼沒有 +1 , 表示式都沒有執行! sizeof(++i) 和 sizeof(i) 和 sizeof(int) 沒有區別!

第1個問題: sizeof("123456789") 為什麼是 10 ? 因為 "123456789" 的型別是 const char[10] !

(注意 "123456789"後面有乙個默默無聞的 '\0' 字元)這是乙個 10 個字元的陣列型別, sizeof(const char[10]) == sizeof(char)*10,所以是10 !至於為什麼 "123456789" 的型別是 const char[10], 那不是 sizeof 的問題,是 c/c++ 型別系統就是這麼規定的!

sizeof("12345689"+1) == 10???!!!! 如果結果是 10, 只能說編譯器有問題吧 !"123456789"+1 的型別是 char*,所以sizeof("123456789"+1) == sizeof(char*) == sizeof(int*) == 4 or 8 !!!

(10 不能說不對, 但是感覺略奇葩,就像 c 中 sizeof(char) 其實可以不等於 1, 乙個位元組可以不是 8 bit 一樣! )

這裡就不得不提 c/c++ 中的型別轉換, 除了 sizeof 和 & 乙個陣列 T[N] 之外譬如 sizeof(char[5]), 其他時候陣列型別 T[N] 都隱式轉換為 T* , so, "123456789"+1 的型別是 char* !

c/c++ 的型別以及型別轉換這裡省略一篇作文的長度,%>_<%

3樓:喜七

sizeof 這個編譯時函式的目的是得到乙個變數或型別占用的位元組數,它的求值是由編譯器完成時,沒有執行時邏輯。像「123456789」這樣的字串字面量,型別為char[10],因為C的字串需要末尾有乙個\0來表示結束的。 所以b的結果為10應該是乙個bug。

strlen 是乙個C的庫函式,是執行時的求值過程,這個應該很好理解。

4樓:觀象士

sizeof由編譯器實現,strlen由標準庫實現。你可以寫int a[sizeof(int)];但strlen不能,可以自己研究

5樓:Xi Yang

沒搞錯的話,字串常量放在表示式中返回的是此字串常量的首址。這裡的b為10,不解sizeof針對的是型別的尺寸。第二次輸出i仍是10,"++i"為什麼沒被執行,不解sizeof是乙個編譯時完成的東西。

整個sizeof表示式在編譯時被析值成那個尺寸。裡面的東西在執行時是不存在的。

C語言中sizeof和strlen的詳細用法

sizeof和strlen是C語言中經常會用到滴兩個東西,其區分常常出現在陣列。sizeof是求乙個變數占用了多少位元組的記憶體空間,而strlen是求這個字元變數 0前有多少個字元。比如 char arr1 abcd char arr2 在C語言裡是區分雙引號 和單引號 的,我是python轉C,...

c語言的加減乘除是怎麼實現的?

大致了解簡單的過程,我們知道機器執行的都是機器碼,加減乘除這些在硬體層面CPU都提供對應的指令 我們能讀懂的是彙編指令 編譯器在編譯的時候直接將高階語言的加減乘除轉化為對應的CPU指令,完成對應的運算。比如intel彙編中 加法,addl 減法,subl 乘法,imull 除法,idivl 比如我寫...

c語言中為什麼都用 d輸出sizeof的運算結果?

buzouxun 前面的答案已經說的很好了。我補充一下,可能題主剛開始學沒留意到,d 的 d 是 decimal 的首字母,decimal 當然創造C語言的大佬沒必要瞎起名字,decimal 是十進位制 整數 的意思。sizeof 返回所佔的位元組數,就是佔了多少個 byte,那的確是個 十進位制 ...