簡體   English   中英

編譯器如何在c中評估sizeof運算符

[英]how compiler works to evaluate sizeof operator in c

雖然在這個論壇上已經提出了幾個問題以及其他與sizeof運算符相關的問題,但我無法得到關於編譯器如何評估sizeof運算符以查找任何數據類型,變量,指針,數組等的大小的任何答案。如果可能的話也指向我一些鏈接可以幫助我詳細了解這一點。 任何幫助將不勝感激。 謝謝。

編譯器只知道原始數據類型的大小; 這種知識從根本上構建在編譯器中。

對於傳統的固定大小的數組和復雜的數據類型(結構和類),它只是將組成原語的大小和帳戶相加以進行任何必要的填充。 http://en.wikipedia.org/wiki/Data_structure_alignment

在大多數情況下, sizeof()計算在編譯時完成。 例外情況是變長數組(C99中的新數組),一旦知道了元素數,就會在運行時計算它。

大小信息來自編譯器內部的信息。

編譯器知道基本類型的大小,例如charintdouble和指針,因為它們是在編譯器中設計的。

編譯器通過添加所有部件的大小來計算復合結構的大小,包括結構中的成員,加上用於對齊的任何填充,以及支持語言功能的任何隱藏部分(例如指向支持多態的類信息的指針) 。

編譯器通過將元素數乘以每個元素的大小來計算數組的大小。

根據定義, char的大小為1。 請注意,它不一定是8位,但總是1個字節。

原始類型和指針每個都具有編譯器知道的固定大小。 這些可能因編譯器和平台而異。

數組是根據元素類型的大小乘以元素數量計算出來的。

C中的結構和C ++中的類至少與其非靜態數據成員的總和一樣大。 它們可能更大,以便正確對齊成員; 在C ++中,可能存在額外的,不可訪問的數據成員來支持多態性。

源代碼中聲明的變量大小始終為程序所知,無論它們是數組,結構還是等等。但是大多數數據類型都有固定的大小來定義它們。 我們有不同數據類型的原因是因為我們需要不同大小的數據類型。 char是任何可以容納1個字節的字符。 為了這個例子,這只能代表數字0-9。 因此,假設我們有一個16位長的數字,如果我們只有字符,那么計算機需要16個字節來表示該數字。 知道想象一個8位長的數字(這是一個字節),它的每個8位數中只能有2個可能的值(0或1),你只能擁有64種可能的唯一組合。 現在假設這64個組合中的每個組合都代表一個特定的數字。 你可能很可能在16字節以內的16位長數字。 這就是int數據類型背后的想法。 請注意,我簡化了int和chars的解釋,以便我可以解釋它們而不必太深入。 現在我知道你對數組的看法是什么?

for (i = 0; array[i] != NULL; i++) {}

上面的代碼基本上是strlen()函數的作用。 你有沒有想過為什么數組以NULL字符終止? 部分原因是它使得查找數組的長度與上面的代碼一樣簡單。 所以要回答你的問題sizeof()真的有劑量計算它已經知道的價值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM