CPP_Details_Medium0.2

版权声明:本文虽为 贴墙上的咖啡 原创,未经允许仍可转载. https://blog.csdn.net/enochhugh/article/details/83578568

1.extern “c”:
正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器该部分代码按C标准进行编译,而不是C++标准。
核心区别:
由于C++支持函数重载,因此编译器编译函数的过程中会将函数的签名(返回类型和参数类型)也加到编译后的代码命名空间中,而不仅仅是原始函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。

常用范围:
a、C++代码调用C语言代码
b、在C++的头文件中使用
c、多人协同开发,可能有人比较擅长C语言,而有人擅长C++

涉及编译预处理指令

/*防止该头文件被重复引用*/
#ifndef __Work_Group 
#define __Work_Group

————————//指示编译器这部分代码按C标准进行编译———————
#ifdef __cplusplus  

extern "C"{

#endif

/C代码块/

#ifdef __cplusplus
}
#endif
————————//指示编译器这部分代码按C标准进行编译———————

#endif /*end of __Work_Group*/

2.const和constexpr
const:
const 一旦定义,不可更改,应立即初始化;
修饰类型:变量,引用,指针,字符串常量
修饰位置:函数形参、函数声明返回值、函数尾部、成员变量等。
任何时候都应尽可能使用const。
const和指针:

常量指针(const位于*左侧)int const* p;
或者
const int* p;//优先使用
//指针p可变,所对应常量内容*p不可修改

指针常量(const位于*右侧)int * const p;//
//指针p不可变,所对应的内容*p可修改

指向常量的常指针:(总之他们都适用就近原则)
const int * const p

constexpr:
const修饰一个对象表示它是常量,暗示编译器可优化;
constexpr修饰常量表达式,必须能在编译阶段被识别为常量但不一定被计算;
区别:
所有constexpr都是const,但不可逆;
constexpr模糊了编译期和运行期的工作界限;
constexpr不允许有I/O语句;
C++11中constexpr只能一条return sth.;
C++14放宽,可以多条语句甚至包括auto、for语句;

3.restrict和volatile:
restrict:
函数库接口中用得多,主要用来修饰指针指向的内存不能被别的指针引用。

volatile:
易变性:从内存中读取而不是寄存器
不可优化性:信任开发者代码,阻止编译器优化
顺序性:多线程下volatile变量间保持顺序,非volatile和volatile直接不保证顺序性,不能用于构建happens-before语义,涉及内存可见性问题

4.static
类的静态成员存在于任何对象之外,对象中不包含与静态成员有关的数据;但类对象、引用和指针仍然可以访问静态成员;直接访问可通过所包含类的作用域运算符比如 Account::;同理,静态成员函数也不与任何对象绑定,不包含this指针(隐式显式均无效),作为结果,静态成员函数不能声明为const。
简而言之,应用局部固定作用域内的值,应用全局则将变量限制于该声明文件中。C++使用自动存储(局部变量,使用栈,后进先出);静态存储(函数外定义或者使用static,存在于整个程序周期);动态存储(灵活,使用堆,可在A函数创建,B函数释放)。在栈中,内存的占用是连续的,而在堆中,new和delete的使用导致内存不连续,使得跟踪新分配的内存更加困难,少用裸指针。

5.inline的优劣
优点:减少函数调用开销、通知编译器优化
缺点:增加函数体积,二进制文件太大,占用CPU资源,可导致cache装不下(减小了cache的命中) ,不方便调试,debug下一般不内联, 每次修改会重新编译头文件增加编译时间
注意: inline只是一个请求,编译器有权利拒绝。有7种情况下都会拒绝,虚调用,体积过大,有递归,可变数目参数,通过函数指针调用,调用者异常类型不同,declspec宏等
forceinline字面意思上是强制内联,一般可能只是对代码体积不做限制,但是对于上面的那些情况仍然不会内联,如果没有内联他会返回一个警告。 构造函数析构函数不建议内联,里面可能会有编译器优化后添加的内容,比如说初始化列表里面的东西。

6.CPP为什么构造函数不能设置为虚函数:
对象尚未构造,vptr还没有被设置,会出现先有鸡还是先有蛋的矛盾;且使用意义上也是没有必要的。

猜你喜欢

转载自blog.csdn.net/enochhugh/article/details/83578568
cpp
今日推荐