《C++ Primer Plus(第六版)》(13)(第九章 内存模型和命名空间 笔记)
1.為了保持通用性,C++使用術語翻譯單元,而不是文件,文件不是計算機組織信息時的唯一方式。
2.C++允許編譯器使用自己的名稱修飾,因此不同的編譯器編譯出來的二進制模塊(對象代碼文件),通常是無法鏈接的。
3.
自動存儲持續性:代碼塊內局部的變量,走過了就自動消失了。
靜態存儲持續性:程序員了,就一直存在,直到程序結束。起作用域看聲明的位置。
線程存儲持續性:并行編程用到,使用tread_local聲明,則與線程同壽了。
動態存儲持續性:用new來分配的內存,直到delete才回收。
4.在C++舊版本和C中,auto是用于顯示聲明自動存儲的。但是因為自動存儲在局部變量中是默認的,所以幾乎沒人使用。
在C++11之后auto這樣的用法被刪掉了,改成自動類型推斷。
5.自動存儲被放在棧中。
棧是用來對自動變量進行管理,之所以成為棧,就是新數據被象征性放在原有數據的上面。
棧是后進先出的。
棧使用兩個指針,一個在底部,一個在頂部,上面的數據沒用之后,頂部指針向下移動,之前的位置上的內容就不再被標記,但是沒有刪除的。
當下一個數據放入棧中的時候,就會覆蓋剛剛的內容。
6.靜態存儲的變量,因為一直存在,所以編譯器分配了固定的位置給它們。變量的每個元素或成員的默認值都是0。
7.內部鏈接和外部鏈接的問題。
先看看代碼:
main.cpp
#include "Test.h" #include <iostream>using namespace std;extern int test; extern int test2; void tttttt() {cout << test << endl;cout << test2 << endl; } Test.h #ifndef _Test_H_ #define _Test_H_void tttttt(); #endifTest.cpp #include "Test.h" #include <iostream>using namespace std;extern int test; extern int test2; void tttttt() {cout << test << endl;cout << test2 << endl; }在main.cpp里面聲明了靜態變量test,和test2.只有test2用了static。
在Test.cpp中是無法直接使用的。
所以使用了外部聲明。但是因為test是外部鏈接的,所以能鏈接上。
而test2是內部鏈接的。鏈接不上,實際上,編譯的時候會報錯:
1>------ 已啟動生成: 項目: CppPrimer, 配置: Debug Win32 ------ 1> main.cpp 1> Test.cpp 1> 正在生成代碼... 1>Test.obj : error LNK2001: 無法解析的外部符號 "int test2" (?test2@@3HA) 1>E:\mywokespace\CppGame\Debug\CppPrimer.exe : fatal error LNK1120: 1 個無法解析的外部命令 ========== 生成: 成功 0 個,失敗 1 個,最新 0 個,跳過 0 個 ==========9.存儲說明符
auto(C++11中已經不是說明符了)
register(C++11以前是指示寄存器存儲,C++11之后就是顯式支出自動變量)
static:靜態存儲
extern:外部變量
thread_local:線程變量,C++11新增的,可以與static或extern一起使用
mutable:聲明這樣的成員,表示即使變量為const,其屬性也可以改變
cv-限定符:
const:常量
volatile:中文意思是可變的,多變的,聲明了這個關鍵字的變量,可能即使不對其進行修改,其本身也會產生變化。
聲明了volatile的變量,將不再放在寄存器中進行訪問優化。
10.使用外部C語言庫的時候,引用他們的函數可以用extern
extern "C" void spiff(int);
即使是同一個編譯器,編譯出的C和C++的鏈接語言也可能不同。因為C中沒有重載,C++有重載,所以函數名肯定要復雜多。
11.通常編譯器使用三塊獨立的內存:靜態變量,自動變量(棧),動態變量(堆)。
12.using可以指定使用命名空間,可以指定使用命名空間中的某個屬性。
#include <iostream> #include <array> #include <string> #include <set> //#include "test.h" using namespace std;//使用命名空間 namespace FableGame {int test = 1; } int test = 2; int main() {using FableGame::test;//使用某個屬性cout << test << endl;//1cout << ::test << endl;//2std::cin.get();std::cin.get();return 0; }13.可以給名稱空間創建別名,例如: namespace a {}; namespace b = a;
轉載于:https://www.cnblogs.com/fablegame/p/6430251.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的《C++ Primer Plus(第六版)》(13)(第九章 内存模型和命名空间 笔记)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: eclipse自动排版JSP问题
- 下一篇: Android中实现APP文本内容的分享
