1 2 3 4 5 6 7 8 9 10 | #include <iostream> #include <iomanip> //~ #include <sqlite.h> //~ #include <mysql/mysql.h> using namespace std; template <unsigned int x, unsigned int y, bool is_ordered = (x >= y)> //~ 一般情况下x>=y struct static_gcd { static int const value = static_gcd<y, x % y>::value; }; |
Archive for ‘边走编程’ Category

这里面有三张函数表,分别对应d的三个基类。事实上,d的虚函数d()的地址保存在了基类B1对应的虚函数表内。从多重继承的内存布局,我们可以看到子类新加入的虚函数被加到了第一个基类的虚函数表,所以当dynamic_cast的时候,子类和第一个基类的地址相同,不需要移动指针,但是当dynamic_cast到其他的父类的时候,需要做相应的指针的移动。
在C++程序中,有下面五”类”内存:
- 在栈上创建。在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,一般使用寄存器来存取,效率很高,但是分配的内存容量有限。
- 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete来释放内存。动态内存的生存期由程序员自己决定,使用非常灵活。
- 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
- 文字常量分配在文字常量区,程序结束后由系统释放。
- 程序代码区。
使用优化选项编译:
1 | $ g++ test.cpp -o test -O2 |
此时的运行时间:
real 0m0.008s user 0m0.000s sys 0m0.004s |
so amazing!
g++有四个级别的优化选项,分别对应于 -O1, -O2, -O3, -O4.
比较下面两段代码:
1 2 3 4 | for(int i = 0; i < n; i++) { //~ do something; } |
1 2 3 4 | for(int i = 0; i < n; ++i) { //~ the same thing; } |
1 2 3 4 5 6 7 8 9 10 11 | #include <algorithm> #include <cmath> #include <cstdlib> #include <iostream> #include <limits> #include <string> #include <sstream> #include "matrix.hpp" #include "vector.hpp" |
与其说计划,倒不如说是给自己制定一个目标和任务。
大约三周的生产实现,料定不会有什么新花样,看透了“培养计划”里面的这些课程,从来都不会有实质性的东西。sucks!但是无论如何这都是必须要完成的任务,积极面对吧。无聊的“生产实习”:I love you game!
三周,一定要把操作系统过一遍,一定能弄清楚很多以前觉得模模糊糊、似懂非懂的概念,第一遍能有一个整体的把握即可。昨天在当当定了一本《深入理解Linux内核》,经典制作,学完操作系统后再从这本书中挑出几个模块来学习,肯定受益良多!线性代数,接下来的一个月内也必须得吃透了,有很多东西确实是忘的一干二净了。
一个double类型的vector,没有把它实现成模板,专门用做普通的数值运算,接口定义在vector.hpp, 实现在vector.cpp,Vector类的整体放在了命名空间(namesapce)dutor内,在该命名空间外还实现了一些常用的全局的运算符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #ifndef DUTOR_VECTOR_HPP #define DUTOR_VECTOR_HPP #include <iostream> namespace dutor { class Vector { public: Vector(int dim = 1); //构造函数,默认dim = 1 Vector(double v0, double v1); //~ 以两个值v0, v1初始化一个二维点 Vector(double v0, double v1, double v2); //~ 以三个值v0, v1, v2初始化一个三维点 Vector(const Vector& dv); //~ 复制构造函数 //~ ...... |
这些都是对一个设计良好的类的最基本的要求,每当完成一个类的设计时,都要把这些问题都审视一遍,养成好的习惯。
- 构造函数
- 数据成员是私有的
- 无参数的构造函数
- 初始化所有数据
- Destructor
- 有可能被继承的话一定 destructor 要virtual,否则,尽量不用virtual
- Copy Constructor
- x=x 能正常工作?(自己赋值给自己)
- 逻辑关系运算符?
- Copy Constructor/operator= 使用 const reference
- 函数参数用reference 还是 const reference 还是 object
- 不修改成员的函数一定得要const,否则作为const reference 无法调用。
从单个源文件生成可执行程序
下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码:
1 2 3 4 5 6 7 | /* helloworld.cpp */ #include <iostream> int main(int argc,char *argv[]) { std::cout << "hello, world\n"; return(0); } |