C++知識

C++編譯過程

在這裏插入圖片描述

  1. 預處理
    展開所有宏定義,沒有條件編譯指令,刪除特殊符號
  2. 編譯
    將預處理完的文件進行一系列詞法分析、語法分析、語義分析及優化後,產生相應的彙編代碼文件。
  3. 彙編
    將編譯完的彙編代碼文件翻譯成機器指令,並生成可重定位目標程序的.o文件,該文件爲二進制文件,字節編碼是機器指令。
  4. 鏈接
    通過鏈接器將一個個目標文件(或許還會有庫文件)鏈接在一起生成一個完整的可執行程序。
    將生成的.obj文件與庫文件.lib等文件鏈接,生成可執行文件(.exe文件)
    例如,某個源文件中的函數可能引用了另一個源文件中定義的某個符號(如變量或者函數調用等);在程序中可能調用了某個庫文件中的函數,等等。所有的這些問題,都需要經鏈接程序的處理方能得以解決。
    鏈接程序的主要工作就是將有關的目標文件彼此相連接,也就是將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的這些目標文件成爲一個能夠被操作系統裝入執行的統一整體。
    在這裏插入圖片描述

條件編譯作用

選擇運行環境、省去某些模塊的編譯、防止重複定義

局部變量 全局變量

全局變量的生存期從進程創建開始,一直到進程運行完畢,所有內存被操作系統回收位置爲止。
局部變量的生存期,是從函數創建它開始,到函數調用完畢,被操作系統回收這一段時間。
全局變量,靜態局部變量,靜態全局變量都在靜態存儲區分配空間,而局部變量在棧裏分配空間。
存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化
進程創建和main函數調用是兩個概念,進程創建包括代碼加載、數據加載、內存空間分配過程,是操作系統完成的,而main函數是進程調用的

靜態局部變量

放在數據段中的,只初始化一次,下次調用這個函數時,保留原來的值,繼續使用。

靜態全局變量、靜態函數

本來全局變量其他文件也可以訪問(在當前文件中使用extern來聲明其它文件中定義的全局變量),函數其他文件也可以調用,爲了將作用域限制在該文件內。

靜態/全局變量初始化時間

  • c中:
    在C中,靜態變量,即全局變量和static變量,是在程序運行前創建的,其中已初始化的全局變量和static變量在編譯彙編成目標文件時,初始值就已經保存在磁盤的.data段了,進程加載時將其映射到內存空間即可;
    未初始化的全局變量需要進程加載時真正的爲.bss段分配內存空間,並賦值爲0。靜態變量的創建和初始化都是在運行前完成的,切記C中不能動態初始化。
  • c++中:
  1. c++內部定義的數據結構: 靜態初始化 彙編時初始化
  2. 全局或局部靜態對象 :C++中由於引入對象,對象生成必須調用構造函數,因此C++規定當且僅當對象首次用到時進行構造。在main函數執行前由運行時庫調用對應的代碼進行初始化。

靜態成員

靜態常量成員可以在類內初始化,靜態成員只能在類外初始化

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章