標籤:

C語言中定義的結構體,如果並沒有實例化為任何一個變數。那這部分代碼存放在內存的什麼區域?

下面這段解釋對嗎? [quote=引用 3 樓 Saleayas 的回復:] 在編譯之後,沒有這個結構的存在。 就算被引用了,也沒有這個結構存在,僅僅存在這個結構描述的內存布局,也就是說如何依據指向結構的指針如何取得成員的指針。而這個布局被內嵌到成語的代碼中。 struct test { int a; } struct test2 { int a; } 她們在編譯之後是一致的。僅僅是內存的一個布局,影響到如何獲取成員的偏移量。 但是在一個地方他們是不一致的,那就是調試符號。 [/quote] 也就是說定義一個結構體,只是告訴編譯器結構體變數內部的布局。並不會生成在實際的代碼或內存中?就跟int 這種系統的一樣嗎 是一種操作指令?


C/C++ 的特點就是所有 declarative knowledge 都被丟棄了。剩下的全是 imperative instructs 怎麼去用這些 declarative knowledge 的行為,而這些行為都是 compile time 就定的。所以「定義一個結構體,只是告訴編譯器結構體變數內部的布局。並不會生成在實際的代碼或內存中」這個理解是對的。


編譯後什麼都沒有 不會留下任何信息 反而 一旦你引用也好 則會產生空間分配 比如在棧上 在堆里 (maclloc) 在靜態存儲區 .bss 中 或是在 literals 代碼段中


是的。編譯之後並沒有什麼地方存這個東西。但這個東西對內存布局是有影響的。我知道說這麼抽象你又不懂了。我們來看一個看過之後你就會一通百通的實例。

比較下面的兩段代碼

struct A { int x; int y; };
int main() {
struct A a;
a.x = 3;
a.y = 4;
}

int main() {
int x;
int y;
x = 3;
y = 4;
}

它們生成的代碼是一模一樣的。也就是說,都是類似代碼:

load base - 0, 3 ; int x = 3 or a.x = 3
load base - 4, 4 ; int y = 4 or a.x = 4

其中base指向棧空間的某處

都是內存偏移量。


?c的結構體在源代碼文件定義與內存布局的機制,和劇本與電影有點像。

?劇本(源代碼)中使用一段話描述了一個場景(結構體定義)

?導演拍攝時(編譯器編譯時),根據導演的理解(語法規則),將劇本場景描述(結構體定義),轉換為電影場景(結構體運行時內存布局)。

?有些場景描述(結構體定義)沒有拍攝(實例化),電影(內寸運行時環境)中沒有這個打鬥場景(結構體內存布局)。


這個解釋科學嗎?

類型定義(沒有成員函數),編譯的時候,放在 編譯器的符號表裡,如果這個類型既沒有靜態成員變數, 也沒有定義變數常量(包括引用) ,也沒有被函數使用(不是函數參數表中某個參數類型的一部分), 沒有用來定義其他類型的成員變數(常量) 且不是一個嵌套類的成員 那麼編譯後的代碼中, 一般不會包含這個類型的信息. 也就是說符號表這部分,可能會被丟棄 結構定義也是一種類型定義. 類型定義本身.相當於聲明


推薦閱讀:

2017年移動設備界面設計有哪些趨勢?
如果小米手機成功搭配iOS系統,那麼蘋果手機會面臨著滅亡嗎?
潑辣修圖,通過人工智慧與卓越體驗,幫助用戶更好地處理照片 | NEXT Big

TAG:iOS |