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