C++
低头看天,抬头走路
句句都是正确的废话,招招都是致命的空招。
展开
-
头文件规则
头文件中只可以放置函数声明,不可以放置函数定义吗?先分析下面的程序:// a.h#ifndef __a_h__#define __a_h__void funcA(void); // 声明void funcA(void) // 定义{}#endif// b.h#ifndef __b_h__#define __b_h__void funcB(void);#endi...原创 2020-01-08 17:25:53 · 236 阅读 · 0 评论 -
include头文件和前置声明
两个原则第一个原则是,如果使用的仅仅是一个类的指针或者引用,没有使用这个类的具体对象(非指针),也没有访问到类的具体成员,那么前置声明就可以了。因为指针这一数据类型的大小是特定的,编译器可以获知。第二个原则应该是,尽量在CPP文件中包含头文件,而非在头文件中。假设类A的一个成员是是一个指向类B的指针,在类A的头文件中使用了类B的前置声明并编译成功,那么在A的实现中我们需要访问B的具体成...原创 2020-01-03 12:03:30 · 553 阅读 · 0 评论 -
c++ 动态库和静态库
静态库的名字一般是libxxx.a,代码在编译过程中已经被载入可执行程序,因此体积比较大,程序运行时将不再需要该静态库。动态库的名字一般是libxxx.so,代码在编译过程中仅简单的引用,在可执行程序运行时才载入内存。因此代码体积比较小,程序运行时需要动态库。动态库与程序代码独立,这样就可以提高代码的可复用度,和降低程序的耦合度。区别:速度方面,静态库把库直接加载到程序中,运行速度比较快;动...原创 2019-07-01 00:35:50 · 517 阅读 · 0 评论 -
c++编译过程
编译预处理1.h文件2.宏定义3.条件编译指令编译优化比较复杂。汇编汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程,一个目标文件中至少有两个段。代码段:该段中所包含的主要是程序的指令,该段一般是可读和可执行的,但一般却不可写。 数据段:主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。链接程序静态库和动态库,见博客c++ ...原创 2019-07-28 22:05:37 · 87 阅读 · 0 评论 -
C++ 声明、定义、初始化与赋值
一般我们进行成员变量初始化用两种方法第一种是通过在构造函数内赋值class Point{public:Point(){ _x = 0; _y = 0;};Point( int x, int y ){ _x = 0; _y = 0; }private:int _x, _y;};第二种是使用初始化列表class Point{public:Point():_x(0),_y(0...原创 2019-07-26 00:20:44 · 4174 阅读 · 0 评论 -
++i、i++、i+=1、i=i+1的区别
首先对于内置类型,对于现代编译器而言,这四个的效率都是没有区别的但是对于自定义类型,这就不一样了a++是先赋值再自增,++a是先自增再赋值。a++是先用临时对象保存原来的对象,然后对原对象自增,再返回临时对象,不能作为左值;++a是直接对于原对象进行自增,然后返回原对象的引用,可以作为左值。由于要生成临时对象,a++需要调用两次拷贝构造函数与析构函数(将原对象赋给临时对象一次,临时对象以...原创 2019-08-01 21:36:34 · 3592 阅读 · 0 评论 -
提高C++程序运行效率
一、尽量减少值传递,多用引用来传递参数。至于其中的原因,相信大家也很清楚,如果参数是int等语言自定义的类型可能能性能的影响还不是很大,但是如果参数是一个类的对象,那么其效率问题就不言而喻了。例如一个判断两个字符串是否相等的函数,其声明如下bool Compare(string s1, string s2)bool Compare(string *s1, string *s2)bool C...原创 2019-08-14 00:13:36 · 271 阅读 · 0 评论 -
为什么参数从右到左进栈
了解函数调用,所涉及栈帧分配,见下图1:这个图也有意思,把函数调用之间的关系展示了出来。理论分析假设现在有函数f,固定参数m个,可变参数n(未知)个,假设所有参数都是32位整数,如果不是整数,也可以根据参数类型,推出参数地址,为了简单画图,在此使用整数。自右向左(逆变量声明顺序)那么调用栈图自右向左入栈的调用栈虽然不知道可变参数n的大小,但是,依然可以根据固定参数的大小m,找到可...转载 2019-08-22 22:14:02 · 765 阅读 · 0 评论