C/C++服务器开发常见面试题(三)

43. 内存对齐的原则?内存对齐的作用?

内存对齐的原则:
A.结构体的大小为最大成员的整数倍
B.成员首地址的偏移量为其类型大小整数倍

内存对齐的主要作用是:
1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因:经过内存对齐后,CPU的内存访问速度大大提升。CPU把内存当成是一块一块的,块的大小可以是2,4,8,16字节大小,因此CPU在读取内存时是一块一块进行读取的。块大小成为memory access granularity(粒度)

44. 内联函数与宏定义的区别?

内联函数是用来消除函数调用时的时间开销。频繁被调用的短小函数非常受益。
A. 宏定义不检查函数参数,返回值什么的,只是展开,相对来说,内联函数会检查参数类型,所以更安全。
B. 宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的

45. 动态分配对象和静态分配对象的区别?

动态分配就是用运算符new来创建一个类的对象,在上分配内存。
静态分配就是A a,这样来由编译器来创建一个对象,在上分配内存。

46. explicit是干什么用的 ?

explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显式的, 而非隐式的, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了。 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)

47. 内存溢出有那些因素?

(1) 使用非类型安全(non-type-safe)的语言如 C/C++ 等。
(2) 以不可靠的方式存取或者复制内存缓冲区。
(3) 编译器设置的内存缓冲区太靠近关键数据结构。

48. new与malloc的区别,delete和free的区别?

1.malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符
2.new能够自动分配空间大小,malloc传入参数。
3. new/delete能通过对对象构造和析构函数的调用进而对内存进行更加详细的工作,而malloc/free不能。
既然new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

49. 必须使用初始化列表初始化数据成员的情况

1.是对象的情况;
2.const修饰的类成员;
3.引用成员数据;

类成员变量的初始化不是按照初始化表顺序被初始化,是按照在类中声明的顺序被初始化的。

50.深入谈谈堆和栈

1).分配和管理方式不同 :
堆是动态分配的,其空间的分配和释放都由程序员控制。
栈由编译器自动管理。栈有两种分配方式:静态分配和动态分配。静态分配由编译器完成,比如局部变量的分配。动态分配由alloca()函数进行分配,但是栈的动态分配和堆是不同的,它的动态分配是由编译器进行释放,无须手工控制。
2).产生碎片不同
对堆来说,频繁的new/delete或者malloc/free势必会造成内存空间的不连续,造成大量的碎片,使程序效率降低。
对栈而言,则不存在碎片问题,因为栈是先进后出的队列,永远不可能有一个内存块从栈中间弹出。
3).生长方向不同
堆是向着内存地址增加的方向增长的,从内存的低地址向高地址方向增长。
栈是向着内存地址减小的方向增长,由内存的高地址向低地址方向增长。

51.内存的静态分配和动态分配的区别?

**时间不同。**静态分配发生在程序编译和连接时。动态分配则发生在程序调入和执行时。
**空间不同。**堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。alloca,可以从栈里动态分配内存,不用担心内存泄露问题,当函数返回时,通过alloca申请的内存就会被自动释放掉。

52. 模版怎么实现?模版作用?

实现:template void swap(T& a, T& b){}
作用:将算法与具体对象分离,与类型无关,通用,节省精力

53. 多重类构造和析构的顺序

记住析构函数的调用顺序与构造函数是相反的。
转载自:https://blog.csdn.net/qq_43309286/article/details/93011870
C++中多重继承的构造顺序是
1)虚函数优先构造,其顺序是按继承的顺序来的,而不是按初始化列表来的
2)然后构造普通的基类,其顺序也是按那个继承的顺序来的,不是按初始化列表来的
3)最后构造成员对象
4)构造派生类自己的函数体

C++中多重继承的析构顺序是
1)析构派生类自己的函数体
2)析构成员对象
3)然后析构普通的基类,其顺序也是按继承的顺序来的,也不是按初始化列表来的
4)最后是虚基类

54. 迭代器删除元素后会发生什么?

对于序列式容器(如vector,deque

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值