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...