上一週做業須要的知識:ios
1.內存對齊編程
指的是指數據存儲在內存時的起始地址是不是某個值的整數倍。若是隻是放在內存中,是否對齊自己並無什麼問題。問題是讀取、寫入的時候。訪問一個不對齊的數據(unaligned memory access)可能會致使程序運行效率慢,結果出錯,甚至是程序當掉。函數
內存對齊的規則大數據
(1).對於結構的各個成員,第一個成員位於偏移爲0的位置,之後的每一個數據成員的偏移量必須是 min(#pragma pack()指定的數,這個數據成員的自身長度)的倍數;spa
(2).在全部的數據成員完成各自對齊以後,結構或聯合體自己也要進行對齊,對齊將按照 #pragram pack 指定的數值和結構或者聯合體最大數據成員長度中比較小的那個,也就是 min(#pragram pack() , 長度最長的數據成員)。#pragram pack(n)表示的是設置n字節對齊,vc6默認的是8。指針
2.含有虛函數的類在建立對象時會被分配一個虛指針(vptr),虛指針指向虛函數列表(vtbl),虛函數列表存放該類含有的虛函數。code
3.32位系統指針的大小是4bytes, 64位系統指針的大小是8bytes。對象
我以爲整理書上或者課程的ppt的知識點就是又抄了一遍,對提高編程技能不是頗有用。老師的ppt已經很好了,在上面作點批註就足夠複習用,不必再在別的筆記裏重複。因此我這周開始就把C++ Primer裏面與課程相關的習題作一下,把有錯誤或是須要注意的代碼整理在筆記裏(寫對的就不總結了),這樣能夠在作題的時候應用知識點,也方便之後複習本身出錯的地方,會比較直觀。blog
這一週老師講了C++對象模型,重載new和delete, const等。我把C++ Primer第十二章的知識點複習了一遍,習題從新作了一遍。這一章討論的是動態內存與智能指針,涉及到了new和delete的相關知識。這一次重作讓我發現即便之前寫過這些題,如今再寫也是有些細節的地方也仍是會忽略,還有就是有一部分學過的知識已經忘了,須要再看看。但同時欣慰的是,我看上一次我寫的答案,發現好多當時不懂的如今都懂了。內存
C++ Primer 第十二章 動態內存與智能指針 習題筆記
P411 E12.6
// P411 E12.6.cpp: 定義控制檯應用程序的入口點。 // #include "stdafx.h" #include <vector> #include <iostream>
using namespace std; vector<int>* new_vector() { //看了P317 9.4vector對象是如何增加的,就能夠理解這裏爲何 //能夠new一個vector<int>而不用管vector的大小
return new vector<int>; } void write(vector<int> *pv) { int i; while (cin >> i) pv->push_back(i); } /* //我以爲這個函數帶一個istream或ostream的參數沒有必要 //上面write的那種形式更好 void write(istream& is,vector<int> *pv) { int i; //一開始沒寫循環,致使只讀了一個數進去 is >> i; pv->push_back(i); } */
void read(vector<int> *pv) { for (auto b = pv->begin(); b != pv->end(); b++) { cout << *b << " "; } } int main() { vector<int> *pv = new_vector(); write(pv); read(pv); delete pv; pv = nullptr; return 0; }
P411 E12.7
// P411 E12.7.cpp: 定義控制檯應用程序的入口點。 //使用智能指針的好處就是省去了delete指針的負擔 //若是代碼不少很複雜的話,不免忘記手動delete, //會形成內存泄漏,使用智能指針就不用有這種擔憂
#include "stdafx.h" #include <vector> #include <memory> #include <iostream>
using namespace std; shared_ptr<vector<int>> new_vector(void) { shared_ptr<vector<int>> p = make_shared<vector<int>> (); return p; } void write(shared_ptr<vector<int>> p) { int i; while (cin >> i) p->push_back(i); } void read(shared_ptr<vector<int>> p) { for (auto i : *p) cout << i << " "; } int main() { shared_ptr<vector<int>> p = new_vector(); write(p); read(p); return 0; }
P411 E12.8
//這段代碼想經過new的返回值來判斷new是否成功分配內存 //但普通new失敗即拋出異常bad_alloc,不返回nullptr //能夠把普通的new改爲new(nothrow) int來實現這個目的 //答案上面說應該「經過捕獲異常或者判斷返回的指針來返回true //或false,而不是依賴類型轉換」,我還不太懂
bool b() { int *p = new int; //...
return p; }
P426 E12.23
#include<cstring> #include<memory> #include<iostream> using namespace std; //P39 'a' character literal; "a" string literal int main() { const char* c1 = "hello "; const char* c2 = "world"; char *p = new char[strlen(c1) + strlen(c2) + 1];// strcpy(p, c1);//strcpy和strcat的用法 strcat(p, c2); cout << p << endl; string s1 = "hello "; string s2 = "world"; strcpy(p, (s1 + s2).c_str());//獲得指向string頭的指針c_str() cout << p << endl; delete[]p;//array new 必定搭配array delete system("pause"); return 0; }