2021.4.11牛客刷题小结
文章目录
前言
刷题第一天,个人记录一下学到的知识
提示:以下是本篇文章正文内容,下面案例仅供参考
一、C++部分
1、常量折叠
概念:常数折叠是编译器最佳化技术,被使用在现代的编译器中。
可折叠的常量,像宏一样在与编译阶段对常量的引用一律替换为常量对应的值,二者不同之处:宏替换不会分配空间,而此处的常量会被分配空间。
#include <iostream>
#define PI 3.14
using namespace std;
int main()
{
const int a=10;
int *p=(int *)(&a);
int pi = PI;
*p=20;
cout<<"a = "<<a<<", *p = "<<*p<<endl;
return 0;
}
运行结果:a = 10, *p = 20
调试到return 0 前的语句会发现,p的值和a的地址是一样的,但是最后输出的却不同,这里就出现了常量折叠。
宏是字符常量,在预编译完宏替换完成后,该宏名字会消失,所有对宏如PI的引用已经全部被替换为它所对应的值,编译器就没有必要再维护这个符号了。
而常量折叠会替换值,但同时也会分配空间给该常量。编译器会把他放入到常量表中,同时,会为该变量分配空间,栈空间或者全局空间。
另一种说法:
这是寄存器优化导致的,因为我们定义的是常量,理应不被修改,所以运行的时候会从寄存器缓存中直接读取数据,因为常量不会被修改,没必要每次都从内存读取,现在强制进行修改,但是寄存器里面的‘’幻影数据“不会被同步,这样就出现了”两个指向同一个位置的指针,取出来的值不一样的问题“
如果我们加上volatile修饰,表示这个变量是”易变的“,就会强制每次都从内存中读取,这样就没有问题了。
2、函数指针数组
正确声明方式:int (*(*p)[10])(int *)
1、先看标识符p,p的左边是*,*p代表一个指针。
2、跳出括号,[]的结合性大于*
,所以*
p指向的是一个大小为10的数组。
3、左边又是一个*
,表示修饰数组的元素都是指针类型。
4、根据右边的(int*
)可以判断(*
(*
p)[10])是一个函数指针,并且左边指示了返回值类型为int。
3、表达式判断值
表达式 100!= 90 的值是()
int main()
{
int x=(100!=90);
cout<<"int x = "<<x<<endl;
bool y=(100!=90);
cout<<"bool y = "<<y<<endl;
char z = (100!=90);
cout<<"char z = "<<z<<endl;
return 0;
}
x的值为1,y的值为true,z的值为’\001’。
值与返回值类型有关。
4、友元运算符如何被c++编译器解释
常用
a+b operator+(a,b) a.operator+(b)
-a operator-(a) a.operator-()
a++ operator++(a,0) a.operator++(0)
–a operator–(a) a.operator–();
5、可重入
重入和不可重入
这种情况出现在多任务系统当中,在任务执行期间捕捉到 信号 并对其进行处理时,进程正在执行的指令序列就被信号处理程序临时中断 。如果从信号处理程序返回,则继续执行进程断点处的正常指令序列,从重新恢复到断点重新执行的过程中,函数所依赖的环境没有发生改变,就说这个函数是 可重入 的,反之就是 不可重入 的。
满足下面条件之一的多数是不可重入函数:
(1)使用了静态数据结构;
(2)调用了malloc或free;
(3)调用了标准I/O函数;标准io库很多实现都以不可重入的方式使用全局数据结构。
(4)进行了浮点运算.许多的处理器/编译器中,浮点一般都是不可重入的 (浮点运算大多使用协处理器或者软件模拟来实现。
6、几个数据结构接口
7、构造函数
构造函数不能被继承,构造方法只能被显式或隐式的调用。
8、>和<
<
小于(less than)
>
大于(greater than)
二、哈希表
1、知识体系
三、操作系统
1、层次依赖
外层依赖于内层
2、中断
中断嵌套:当CPU正在处理优先级较低的一个中断,又来了优先级更高的一个中断请求,则CPU先停止低优先级的中断处理过程,去响应优先级更高的中断请求,在优先级更高的中断处理完成之后,再继续处理低优先级的中断,这种情况称为中断嵌套。
中断屏蔽:CPU通过指令限制某些设备发出中断请求,可以用来改变响应事件的中断顺序。
处理中断一般按照中断的优先级对其进行处理,某些时候可以屏蔽掉高优先级的中断,中断产生时系统不予响应,未被屏蔽的低优先级中断反而可以响应,从而改变了中断响应次序。
3、内存屏障
用于解决CPU指令乱序、编译器重排、多CPU内存同步等带来的问题的机制。
表现在高级编程语言中就是加锁
总结
基础知识还是比较薄弱,应该多系统性地复习。
参考
[1]:https://blog.csdn.net/yby4769250/article/details/7359278
[2]: https://www.nowcoder.com/