上一周做业须要的知识: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; }