main函式執行前發生了什麼

2021-08-09 18:27:31 字數 2170 閱讀 7147

main函式的身前

1. 編譯器預設是找

__start

符號,而不是

main

2. __start

這個符號是程式的起始點

3. main

是被標準庫呼叫的乙個符號

我們寫程式,比如乙個模組,通常要有

initialize

和de-initialize

,但是我們寫

c 程式的時候為什麼有些模組沒有這兩個過程麼呢?比如我們程式從

main

開始就可以

malloc

,free

,但是我們在

main

裡面卻沒有初始化堆。再比如在

main

裡面可以直接

printf

,可是我們並沒有開啟標準輸出檔案啊。

(不知道什麼是

stdin

,stdout

,stderr

以及printf

和stdout

關係的群眾請先看看

c 語言中檔案的概念)。

我們會在編譯器的環境中找到乙個名字類似於

crt0.o

的檔案,這個檔案中包含了我們剛才所說的

__start

符號。(

crt

大概是c runtime

的縮寫,請大家幫助確認一下。)

那麼真正的

crt0.s

是什麼樣子呢?下面我們給出部分偽**:

section .text:

__start:

:init stack;

init heap;

open stdin;

open stdout;

open stderr;

:push argv;

push argc;

call _main; (

呼叫main)

:destory heap;

close stdin;

close stdout;

close stderr;

:call __exit;

注意:1.

不同的編譯器,不一定預設得符號都是

__start

。2.

彙編裡面的

_main

就是c

語言裡面的

main

,是因為彙編器和

c編譯器對符號的命名有差異(通常是差乙個下劃線

'_')。

3. 目前作業系統結構有兩個主要的分支:微核心和單核心。微核心的優點是,結構清晰,簡單,核心元件較少,便於維護;缺點是,程序間通訊較多,程式頻繁進出核心,效率較低。單核心正好相反。我說這個是什麼目的是:沒辦法保證每個元件都在使用者空間(標準庫函式)中初始化,有些元件確實可能不要初始化,作業系統在建立程序的時候在核心空間做的。這依賴於作業系統的具體實現,比如堆,單核心結構可能在核心初始化,微核心結構在使用者空間;即使同樣是微核心,這個東東也可能會被拿到核心空間初始化。

隨著cpu

技術的發展,儲存量的迅速擴充套件,**複雜程度的增加,微核心被越來越多的採用。你會為了

10%

的效率使**複雜度增加麼?要知道每隔

18 個月

cpu

的速度就會翻一番。所以我對程式設計師的要求是,我首先不要你的**效率高,我首先要你的**能讓

80%

的人迅速看懂並可以維護。

總結:main

1.設定棧指標

2.初始化

static

靜態和global

全域性變數,即

data

段的內容

3.將未初始化部分的賦初值:數值型

short

,int

,long等為0

,bool

為false

,指標為

null

,等等,即

.bss

段的內容

4.執行全域性構造器,估計是

c++中建構函式之類的吧5.將

main

函式的引數,

argc

,argv

等傳遞給

main

函式,然後才真正執行

main

函式

iOS程式main函式之前發生了什麼

1.動態庫鏈結庫 2.imageloader載入可執行檔案,裡邊是被編譯過的符號,等 3.runtime與 load q 過載自己class的load方法時需不需要調父類?a runtime負責按繼承順序遞迴呼叫,所以我們不能調super q 在自己class的load方法時能不能替換系統frame...

簡述main 執行前後都發生了什麼?

題目 簡述main 執行前後都發生了什麼?1 mian 在執行第一行 之前,呼叫全域性物件 靜態物件的建構函式,初始化全域性變數 靜態變數。2 main 函式最後一句 執行之後會呼叫在atexit 中註冊的函式,並且呼叫順序與註冊順序相反。atexit 函式的引數是乙個指向函式的指標,通過將函式名作...

C C main函式執行前後還會發生什麼

在c c 語言執行過程中是不是所有的動作都由main 函式引起,來看下面的 include class a a a a int main 這段 很簡單,但是最終是不是只是列印了this is main這句話,顯然不是,實際的結果是按照下面順序的三句話 this is constructor this...