1、proc文件夹大小0字节,它存储在内存中,是虚拟文件系统。里面的一些内容是动态从内核中解析出来的,每一个进程在这里都有一个文件夹存储了进程的所有信息,包括文件描述符表,使用资源的一些限制,指令命令的cmd行等等。
2、想要查看一个进程的所有fd在这里面查看。这些进程fd都是符号链接,指向对应的输出文件。
3、类重载运算符:
#include<bits/stdc++.h>
using namespace std;
class A{
public:
int a;
int operator + (A a){
return 0;
}
};
int main(){
A a,b;
cout<<a+b<<endl;
}
4、C++引用即别名,必须被初始化。
5、关于C++分离式编译,当调用一个函数时,会指示在其他文件中寻找实现,找到响应实现的二进制代码之后。然后把执行地址替换上去。
但是泛型不行,泛型是实例化(实例化成具体的函数)是动态的,没有办法分离式编译(泛型是没有转换成二进制的)。
6、野指针是必须要避免的,容易段错误访问越界。
它不同于空指针,空指针指向为空,野指针不一定。
空指针=null其实是赋值为0,是系统内核空间,无法访问。
7、判断某个字符类型可以用Typeid(变量名)。typeid(a).name。会显示出来字符串,比如说i(整型),pi(整型指针)。判断类型是编译器行为,每个编译器返回的结果也可能不相同(原理好像和虚函数也相关)。
Rtti动态类型绑定机制,当实现多态时有时候我们不确定某个对象的类型,指向等等,所以这时候我们就可以用到提供的两个有用的函数:
typeid,dynamic_cast. 用来判断类型,和基类父类转换。
子类的类型指针转换成基类的。
8、dup函数系列都是用来复制文件描述符的,使指向同一个位置。
想要查看每个进程所有信息,去proc文件夹下对应的每个文件。fd中包含所有文件描述符以及指向。
文件重定向的实质是改变指向,比如说改变stdout,定向到某个文件,可以用过stat验证。
9、const和define区别,第一步预编译define就完成了替换,const应该是放在全局区完成替换(这个说法好像是错误的,网上很多说const放在符号表中,是编译器行为,第二部编译的时候替换掉,不是在全局区,不同的编译器处理方法还不一样,这个以后再深究)。
常量引用:对常量的引用。
局部变量返回引用会警告,运行异常。
10、extern的两大作用声明该变量来自外部,编译的时候先别报错。最后连接再一起的时候,再去寻找这个变量的值。
11、关于动态链接库和静态链接库目前的理解:动态链接库就是加入了dll文件,如果需要引入某个模块,把模块导入内存,如果另一个文件也需要,发现内存中有,就不导入了。但是静态链接库,直接把模块引入进来,形成可执行文件。 造成了空间上的浪费,dll存储的模块的定位信息。
12、不允许变量赋值成常量的引用,也就是说一个临时量不能绑定一个常量。
const int a=1;
int &r=a; 这个不行
int a=1;
const int &r=a;可以
#include<bits/stdc++.h>
using namespace std;
int main(){
int a=1;
const int &b=a; //但是不能通过这个修改
cout<<b<<endl;
a=2;
cout<<b<<endl;
//下面这个不行
const int c=1;
int &d=c;
}
13、const是分层的,顶层和底层,顶层const表示指针本身是个常量,底层const表示指向的内容是常量。顶层和底层之间的转换有时候很容易出错,一般规则是变量可以转化成常量,常量不能转化成变量。
https://blog.csdn.net/jfkidear/article/details/80966672
const和constexpr区别含义,constexpr常量表达式,编译器在编译的时候可以进行优化直接替换,相比宏来说更强大,可作为返回值等等,保证了语义的正确性。
14、auto类型的解析是编译器干的。不过我的linux下的gcc版本不支持就很烦。
还有decltype(类型) now=a;
编译器都是知道你的变量的类型的,比如前面用的typeid就是让编译器干的。
这些类型确定是给编译器干的活,当然不同编译处理方式可能也不同。
15、operator
#include<bits/stdc++.h>
using namespace std;
struct node{};
int operator + (node a,int b){
return 1;
}
int main(){
node a;
int b=2;
cout<<operator +(a,b)<<endl;
}
两种普通类型相加,运算符不能重载,也就是说参数必须有个不能直接相加的运算符,相加的时候实际上调用了operator +
16、头文件尽量不要包含,命名空间,因为如果别人用的话,可以会命名冲突,比如说我要用cin作为函数名(存在这种可能性)。
17、右值引用原来是直接寄存器来赋值,所以快了很多。右值引用是c++11的新特性,它有很多特性这些需要积累,背是不可能背会的。
18、列表初始化方式存在溢出风险,但是版本不同,保护机制不同。现在我的编译器就允许,int a{1},b{1},它会自己检查是否存在溢出。
19、mingw和gcc,msvc都是c/c++编译工具。
mingw是一个老大爷对gcc封装,让gcc可以在windows运行。
msvc是微软开发的,应用在vc,vs里面。都可以配。
他们包含的库也有很大差别。
20、