2018.8.8笔记
2018.8.8筆記
void print(int a[2], int n){//OK,數組退化為指針
}
void print(int a[0], int n){//錯
}
數據類型的本質:固定內存大小塊的別名
const vector<int>::iterator iter
*iter = 10;
vector<int>::const_iterator iter
iter++
1,const static float cfx = 30
2,void func() const{}
3,函數重載
void func() const{}
void func(){}
void func(int x){}
void func(const int x){}//這個不是重載,編譯報錯,函數已存在
2018.8.8
程序生成過程:
預編譯-處理#相關的,包括#include
編譯-將源文件編譯成匯編代碼
匯編-將匯編代碼一一對應的翻譯成機器碼,生成obj文件
每個生成的obj文件都包含了: 代碼段,數據段等,見如下obj文件格式
鏈接-將obj拼接起來,去掉多余信息,生成可行文件
由于每個obj中都有代碼段,數據段等,因此鏈接過程中要進行合并
obj與exe格式幾乎相同,有一些鏈接信息:如動態鏈接庫信息等
obj文件格式:
文件頭
.data 數據段 可讀可寫
.text 代碼段 只讀
.rodata 只讀數據段 const 等
.bss 未初始化的全局變量記錄段(并不占物理內存,占虛擬空間)
.debug 調試信息
.dynamic 動態鏈接庫信息
.symtab 符號表,就是程序中用到的變量的名字,局部的及全局的,編譯器生成的,如段名等
鏈接報錯時,錯誤信息大概就是這個符號表的東西吧
.其它
為什么要將代碼段與數據段獨立開?
1,代碼是只讀的,數據是可寫的,必須分開
2,多個實例使用的代碼,不同的數據
3,局部訪問性原理,可提高緩存命中率
動態鏈接與靜態鏈接
靜態鏈接:此時靜態庫就像一個obj文件一樣被縫合進了EXE
試想若每個程序都把系統的庫靜態鏈接入自己中,N個程序將復制N份系統庫,運行時將重復大量的內存
而動態鏈接庫則是共享庫只加載一份到內存中,各程序共同使用它。
因為每個進程都有自己的虛擬空間,這個空間就是CPU的尋址范圍,32位CPU,尋址能力是4GB,
就是說32位CPU上,每個進程的虛擬內存都是4GB
那么,由于動態鏈接庫不是縫合到EXE中的,因此也不能映射到EXE的進程中,
故,動態鏈接庫加載到內存中時也是有獨立的虛擬空間的,
這就引出了一個著名問題:跨鏈接庫 NEW/DELETE的問題,
在一個DLL中用NEW申請內存,在另一個DLL或EXE中 DELETE釋放內存可能會出現問題,
計算機存儲分類:
1,寄存器: CPU內的器件,速度最快的存儲器
2,RAM: random access memory,由觸發器矩陣組成,每8個為一組,構成一個字節
觸發器由電容構成,上電表示1,無電表示0,因此RAM即內存斷電數據丟失
2.1 dram : 動態RAM,就是常說的內存,因為需要定時刷新(上電),故稱為動態內存
2.2 sram : 靜態RAM, 就是常說的cache,因為它不需要刷新(上電),因此速度比內存更快
3,ROM: 只讀存儲器
4,磁盤,也稱硬盤,它真是與磁有關:在金屬表層涂上磁層來存儲信息
磁道非常細小,肉眼不可見,一個盤片有上萬個磁道。
多個盤片組成一個圓柱結構,構成磁盤
磁盤是靠轉動配合磁頭移動來定位并讀寫數據的,顯然這種機械運動比內存的電信號速度差太多了
?
posted on 2018-08-08 18:25 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏
總結
以上是生活随笔為你收集整理的2018.8.8笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】PBR基于物理的渲染
- 下一篇: 几何着色器与细分(镶嵌)着色器