sizeof 究竟是怎樣實現的?

來源:互聯網
上載者:User

http://blog.chinaunix.net/space.php?uid=20545494&do=blog&id=1929750

sizeof究竟是怎樣實現的? (2010-07-17 01:09)分類: C & C++

sizeof,是在編譯的時候,尋找符號表,判斷類型,然後根據基礎類型來取值的,如果是struct則是看型別宣告符號表來判定,如果字串則是通過常 量表來判斷,具體可以參考編譯原理的符號表管理章節,一般都有講,如果沒講,不要讀這本書,呵呵

關於sizeof的一般性的問題,相信大家已經見過很多了。

本文討論的是一些不常見的細節。 

關於sizeof的更多細節:

  1、sizeof(i++)之後,i的值會怎樣?答案是不變。記得大一初學C語言時想研究一下sizeof與函數有什麼區別,得到的結果只 是一些文法上的差別;學了彙編之後看看編譯器產生的程式碼,才發現sizeof在編譯時間直接給定了一個常值,而非在運行時求值。進而又分析過 sizeof(運算式)的結果,清楚了型別提升原理。但我之前沒有注意過運算式中出現副作用的問題,於是在sizeof(i++)的問題上猶豫了。現在經 過查閱資料和實驗,結論是:sizeof在大多數情況下是編譯時間定值的,運算式中的任何副作用(包括有副作用的運算子、函數調用等)都不會發生。這裡說
“大多數情況”,排除了針對C99的新特性——不定長數組(variable length array)的特例。參考這篇文章(http://rednaxelafx.javaeye.com/blog/225909),如果sizeof運算子 的參數是一個不定長數組,則該需要在運行時計算數組長度。  2、sizeof('a')的結果是多少?這個要看是在C中還是C++中了。根據標準的規定,在C的算術型別提升時,字元常量'a'自動提 升為整型,故結果是4(對於32位機器);而在C++中則有字元常量的規定,'a'就是一個單位元組的字元常量,故結果是1。我這樣理解:C強調了char 的“數”屬性,而C++強調了char的“字元”屬性。  3、sizeof('ab')的結果又是多少?'ab'這種文法我以前沒有注意到。經查,這叫做“多位元組字元常量”(multi- character character constant),它限制在單引號中包含2至4個位元組。根據標準,多位元組字元常量的語義由編譯器的實現決定。在我測試的gcc 4.0和VS2008中,如果int a = 'abcd',則a == 0x61626364。sizeof('ab') == sizeof('abc') == sizeof('abcd') == 4。  4、那麼sizeof(L'a')呢?雖然wchar_t是在原始碼級可移植的寬字元,但其大小依賴於作業系統或編譯器的定義。獨立出現的 wchar_t常量並不會像char常量那樣做算術提升,所以sizeof(L'a')就等於sizeof(wchar_t)。在我在32位 Windows和Linux平台下分別為2和4。  5、至於sizeof(L'ab')、sizeof(L'中')、sizeof(L'中國')又會如何?寬字元常量的單引號中出現多個位元組 構成的單個字元(如L'中')是合法的,對它取sizeof,結果等於具體實現下的sizeof(wchar_t)。但出現多個位元組構成的多個字元(如 L'ab'、L'中國')則是沒有定義的,編譯器可能報錯,也可能給出不同的實現。在我測試的gcc4.0和VS2008中,L'abcd'分別返回了 0x64和0x61。對它們取sizeof,結果等於具體實現下的sizeof(wchar_t),但注意這是標準未定義的,不應該確信。 另外,看到的關於sizeof的兩個精巧的宏實現。非數組的sizeof:#defne _sizeof(T) ( (size_t)((T*)0 + 1))數組的sizeof:#define array_sizeof(T)   ( (size_t)(&T+1)  - (size_t)(&T)  )原理就是c/c++中的指標運算。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.