2021-10-11

Q:C++源文件从文本到可执行文件经历的过程

A:对于C++源文件,从文本到可执行文件一般需要四个过程:

预编译阶段:对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件
编译阶段:将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件
汇编阶段:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件
链接阶段:将多个目标文件及所需要的库链接成最终的可执行目标文件 

Q:在头文件中进行类的声明,在对应的实现文件中进行类的定义有什么意义?

A:这样可以提高编译效率,因为分开的话,这个类只需要编译一次生成对应的目标文件,以后在其他地方用到这个类时,编译器查找到了头文件和目标文件,就不会再次编译这个类,从而大大提高了效率。

 

Q:静态链接与动态链接

A:静态链接是在编译期间完成的。

静态链接浪费空间 ,这是由于多进程情况下,每个进程都要保存静态链接函数的副本。
更新困难 ,当链接的众多目标文件中有一个改变后,整个程序都要重新链接才能使用新的版本。
静态链接运行效率高。
动态链接的进行则是在程序执行时链接。

​动态链接当系统多次使用同一个目标文件时,只需要加载一次即可,节省内存空间。
程序升级变得容易,当升级某个共享模块时,只需要简单的将旧目标文件替换掉,程序下次运行时,新版目标文件会被自动装载到内存并链接起来,即完成升级。
 

Q:C++11有哪些新特性

A:

auto关键字:编译器可以根据初始值自动推导出类型,但是不能用于函数传参以及数组类型的推导;
nullptr关键字:nullptr是一种特殊类型的字面值,它可以被转换成任意其它的指针类型;而NULL一般被宏定义为0,在遇到重载时可能会出现问题。
智能指针:C++11新增了std::shared_ptr、std::weak_ptr等类型的智能指针,用于解决内存管理的问题。
初始化列表:使用初始化列表来对类进行初始化
右值引用:基于右值引用可以实现移动语义和完美转发,消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率
atomic原子操作用于多线程资源互斥操作
新增STL容器array以及tuple

Q:assert()是什么

A:断言是宏,而非函数。assert 宏的原型定义在 <assert.h>(C)、<cassert>(C++)中,其作用是如果它的条件返回错误,则终止程序执行。可以通过定义 NDEBUG 来关闭 assert,但是需要在源代码的开头,include <assert.h> 之前。

#define NDEBUG          // 加上这行,则 assert 不可用
#include <assert.h>
assert( p != NULL );    // assert 不可用

 Q:C++是不是类型安全的?

A:不是,因为两个不同类型的指针之间可以强制转换(用reinterpret cast)。

Q:系统会自动打开和关闭的3个标准的文件是?

A:

  1. 标准输入----键盘---stdin
  2. 标准输出----显示器---stdout
  3. 标准出错输出----显示器---stder

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值