2021.4.11牛客刷题小结


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、&gt和&lt

&lt小于(less than)
&gt大于(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/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值