C++里面的关键字,sizeof的作用是什么?
sizeof是一个运算符,用于获取特定类型或变量在内存中占用的字节数。
C++里面有哪些基础类型?表示多少字节?
如果有一个超长的数,long long都表示不下,我们要对这个大数运算,怎么办?
1、用一个大数类来处理:定义一个类,类内部用字符串来存储这个大数,然后编写相关的算法来支持这个数的运算操作。
2、使用Boost库中的boost::multiprecision::cpp_int的类型,可以支持任意精度的整数运算。
C++内存对齐
目的:
1、经过内存对齐后,CPU的内存访问速度大大提示。CPU把内存当成一块一块的,块的大小可以是2,4,8,16个字节,因此CPU读内存是一块一块读取的。比如CPU读取1个4个字节的数据到寄存器,如果数据是从0字节开始,那么直接将0-3四个字节完全读取到寄存区中即可。如果数据是从1字节开始,那么先读0-3,再度4-7,接着把0,5,6,7四个字节剔除,最后合并1,2,3,4四字节的数据进入寄存器。所以,当内存没有进行内存对齐,寄存器进行了很多额外的操作,大大降低了CPU的性能。
2、有利于平台移植。有的CPU遇到未进行内存对齐的处理直接拒接处理,不是所有的硬件平台都能访问任意地址上的任意数据。
规则:
1、结构体第一个成员的偏移量(offset)为0,以后每个成员相对于结构体首地址的offset都是该成员大小与有效对齐值中较小那个的整数倍,如果有需要编译器会在成员之后加上填充字节。
2、结构体的总大小为有效对齐值的整数倍,如果有需要编译器会在成员之后加上填充字节。
有效对齐值:
1、特定平台的编译器都有自己的默认“对齐系数”,vs里为8,可通过#prgma pack(n), n=1,2,4,8,16
来改变这一系数。
2、有效对齐值,#prgma pack(n)和结构体中最长数据类型长度中较小的那个。
一下代码的输出结果是什么?
值传递,引用传递,地址传递?
值传递,将实参的值复制一份传递给函数的形参。
函数内部对形参的修改不会影响到实参的值。
引用传递,将实参的内存地址传递给函数的形参。
函数内部对形参的修改会影响到实参的值。节省内存空间和传递数据的时间。
地址传递,将实参的内存地址传递给函数的形参。
函数内部可以通过解引用来修改实参。
描述一下函数调用的过程
以函数A调用函数B为例:
参数传递以及函数返回点记录:将A传入的参数以及调用完之后的函数的返回地址放在A的栈帧中。
创建新栈帧:调用函数B,此时会为B创建一个栈帧。
跳转到函数体:将程序的控制权转移到被调用函数的函数体内(B)。
执行函数体:在函数体内部执行函数的逻辑(B)。
返回值传递:如果函数有返回值,将返回值传递给调用者。这个过程可以是通过寄存器、栈帧等方法传递。
栈帧销毁:当函数执行完毕并准备返回时,销毁函数的栈帧,释放站上的内存空间。同时,将程序的控制权返回给调用者(A)。
返回地址恢复:从栈上弹出返回地址,并将程序的控制权返回到调用函数的下一条指令。
class和struct的区别?
1、默认的继承访问权限,struct是public,class是private。
2、struct作为数据结构的实现体,它默认的数据访问控制是public的,class作为对象的实现体,它默认的成员变量访问权限是private。
3、class关键字可以定义模版参数,就像typename,但struct关键字不用于定义模版参数。
进程和线程的区别?
进程是程序的一次执行,是系统进行资源分配的基本单位。每个进程都有自己的独立地址、内存、文件描述符、和其他系统资源。
线程是进程内的执行单元,共享同一地址空间和其他资源。多个线程可以共享进程的资源。
你是如何做线程同步的?
互斥锁(Mutex):互斥锁用于保护临界区,确保同一时间只有一个线程访问共享资源。当一个线程获取了互斥锁后,其他线程必须等待锁被释放才能继续执行。常见的互斥锁:std::mutex std::lock_guard std::unique_lock。
信号量(Semaphore):信号量是一个计数器,用于控制多个线程对共享资源的访问。信号量包括两种类型:二进制信号量(只能取值0或1)和计数信号量(可以取任意非负整数值)。常见的信号量有std::binary_semaphore(C++20引入)和操作系统提供的信号量。
条件变量
屏障
原子操作
读写锁