我的笔试记录(主要是C++)

前置自增运算和后置自增运算的重载

由于编译器必须能够识别出前缀自增与后缀自增,人为规定用 operator++() 和 operator–() 重载前置运算符,用 operator++(int) 和 operator–(int) 重载后置运算符,在这里的 int 并没有什么实际的意义,仅仅是为了区分重载的是前置的形式还是后置的形式。

内联函数

用空间换时间。

系统为了实现函数调用会做很多额外的幕后工作:保存现场、对参数进行赋值、恢复现场等等。如果函数在程序内被多次调用,且其本身比较短小,可以很快执行完毕,那么,在完成这个函数调用的时候,系统花在完成这些幕后工作上的时间将远大于最核心的函数本身执行的时间,这就像好钢用在了刀背上,将极大地减低程序的性能。

为了解决这个问题,C++提供了内联函数的机制,通过将函数代码内联到函数调用的地方,避免函数调用过程中的那些幕后工作,从而提高这种短小的函数被重复多次调用的性能。

当编译器编译程序时,如果发现某段代码调用的是一个内联函数,那么它就不再去调用该函数,而是将该函数的代码直接插入当前函数调用的位置,这样就省去了函数调用过程中的那些繁琐的幕后工作,提高了代码的执行效率,这样就以程序空间的增加换取了执行时间的减少。

内存对齐

尽管内存是以字节为单位,但是大部分处理器并不是按字节块来存取内存的。它一般会以双字节、四字节、8字节、16字节甚至32字节为单位来存取内存。

每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。gcc中默认#pragma pack(4),可以通过预编译命令#pragma pack(n),n = 1,2,4,8,16来改变这一系数。

有效对其值:是给定值#pragma pack(n)和结构体中最长数据类型长度中较小的那个。有效对齐值也叫对齐单位。

了解了上面的概念后,我们现在可以来看看内存对齐需要遵循的规则:

(1) 结构体第一个成员的偏移量(offset)为0,以后每个成员相对于结构体首地址的 offset 都是该成员大小与有效对齐值中较小那个的整数倍,如有需要编译器会在成员之间加上填充字节。

(2) 结构体的总大小为有效对齐值的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

友元函数

类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。

友元函数不能是虚函数。C++不支持友元函数的继承,对于没有继承特性的函数没有虚函数的说法。友元函数不属于类的成员函数,不能被继承。

派生类的构造函数和析构函数调用顺序

建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推;

析构对象时,其顺序正好与构造相反;

C++的继承方式

在这里插入图片描述

线程安全

不同的线程对同一个数据进行操作的时候,常常会产生预期之外的结果。

当多个线程访问某个方法时,不管你通过怎样的调用方式、或者说这些线程如何交替地执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类是线程安全的。

如果有多个线程要对某一个数据操作,则需要采取一些措施,让共享的数据同时只能有一个线程对其进行操作。

5个步骤,教你瞬间明白线程和线程安全_CSDN资讯-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值