日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言 手动实现sizeof,sizeof究竟是怎样实现的?

發(fā)布時間:2024/9/27 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言 手动实现sizeof,sizeof究竟是怎样实现的? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

sizeof,是在編譯的時候,查找符號表,判斷類型,然后根據(jù)基礎(chǔ)類型來取值的,如果是struct則是看類型聲明符號表來判定,如果字符串則是通過常

量表來判斷,具體可以參考編譯原理的符號表管理章節(jié),一般都有講,如果沒講,不要讀這本書,呵呵

關(guān)于sizeof的一般性的問題,相信大家已經(jīng)見過很多了。

本文討論的是一些不常見的細(xì)節(jié)。

關(guān)于sizeof的更多細(xì)節(jié):

1、sizeof(i++)之后,i的值會怎樣?答案是不變。記得大一初學(xué)C語言時想研究一下sizeof與函數(shù)有什么區(qū)別,得到的結(jié)果只

是一些語法上的差別;學(xué)了匯編之后看看編譯器生成的代碼,才發(fā)現(xiàn)sizeof在編譯時直接給定了一個常值,而非在運行時求值。進(jìn)而又分析過

sizeof(表達(dá)式)的結(jié)果,清楚了類型提升原理。但我之前沒有注意過表達(dá)式中出現(xiàn)副作用的問題,于是在sizeof(i++)的問題上猶豫了?,F(xiàn)在經(jīng)

過查閱資料和實驗,結(jié)論是:sizeof在大多數(shù)情況下是編譯時定值的,表達(dá)式中的任何副作用(包括有副作用的運算符、函數(shù)調(diào)用等)都不會發(fā)生。這里說

“大多數(shù)情況”,排除了針對C99的新特性——不定長數(shù)組(variable length

array)的特例。參考這篇文章(http://rednaxelafx.javaeye.com/blog/225909),如果sizeof運算符

的參數(shù)是一個不定長數(shù)組,則該需要在運行時計算數(shù)組長度。

2、sizeof('a')的結(jié)果是多少?這個要看是在C中還是C++中了。根據(jù)標(biāo)準(zhǔn)的規(guī)定,在C的算術(shù)類型提升時,字符常量'a'自動提

升為整型,故結(jié)果是4(對于32位機器);而在C++中則有字符常量的規(guī)定,'a'就是一個單字節(jié)的字符常量,故結(jié)果是1。我這樣理解:C強調(diào)了char

的“數(shù)”屬性,而C++強調(diào)了char的“字符”屬性。

3、sizeof('ab')的結(jié)果又是多少?'ab'這種語法我以前沒有注意到。經(jīng)查,這叫做“多字節(jié)字符常量”(multi-

character character

constant),它限制在單引號中包含2至4個字節(jié)。根據(jù)標(biāo)準(zhǔn),多字節(jié)字符常量的語義由編譯器的實現(xiàn)決定。在我測試的gcc

4.0和VS2008中,如果int a = 'abcd',則a == 0x61626364。sizeof('ab') ==

sizeof('abc') == sizeof('abcd') == 4。

4、那么sizeof(L'a')呢?雖然wchar_t是在源代碼級可移植的寬字符,但其大小依賴于操作系統(tǒng)或編譯器的定義。獨立出現(xiàn)的

wchar_t常量并不會像char常量那樣做算術(shù)提升,所以sizeof(L'a')就等于sizeof(wchar_t)。在我在32位

Windows和Linux平臺下分別為2和4。

5、至于sizeof(L'ab')、sizeof(L'中')、sizeof(L'中國')又會如何?寬字符常量的單引號中出現(xiàn)多個字節(jié)

構(gòu)成的單個字符(如L'中')是合法的,對它取sizeof,結(jié)果等于具體實現(xiàn)下的sizeof(wchar_t)。但出現(xiàn)多個字節(jié)構(gòu)成的多個字符(如

L'ab'、L'中國')則是沒有定義的,編譯器可能報錯,也可能給出不同的實現(xiàn)。在我測試的gcc4.0和VS2008中,L'abcd'分別返回了

0x64和0x61。對它們?nèi)izeof,結(jié)果等于具體實現(xiàn)下的sizeof(wchar_t),但注意這是標(biāo)準(zhǔn)未定義的,不應(yīng)該確信。

另外,看到的關(guān)于sizeof的兩個精巧的宏實現(xiàn)。

非數(shù)組的sizeof:

#defne _sizeof(T) ( (size_t)((T*)0 + 1))

數(shù)組的sizeof:

#define array_sizeof(T) ? ( (size_t)(&T+1) ?- (size_t)(&T)

)

原理就是c/c++中的指針運算。

總結(jié)

以上是生活随笔為你收集整理的c语言 手动实现sizeof,sizeof究竟是怎样实现的?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。