C++

C++语言基础

2019-08-16  本文已影响0人  this_is_for_u

extern关键字作用

1.extern置于函数或者变量前,声明这个函数或变量,可以在本地模块使用,但定义在其它模块,需要和其它模块一起链接。
2.extern "C",经常能够看到在函数前包围这种extern c之类,是为了告诉编译器在编译该函数时以c方式编译,编译生成的符号不像c++一样带前后缀(以为C++为了支持多态,不同编译器添加符号不同),而是保持函数本来面目。

static关键字

无论是static成员变量、static局部变量、static全局变量内存都是分配在全局数据区。

volatile关键字

一般使用volatile可以避免编译器做一些优化

int *p = xxx;
int a = *p;
int b = *p;
a和b都等于p指向的值,一般编译器会对此做优化,把*p的值放入寄存器,之后a和b都等于寄存器的值,但是如果p地址的值是动态改变的,这就不符合需求,所以在此对p加volatile修饰可以避免进行此优化

另外volatile基本不能解决多线程问题,多线程问题还是需要依赖原子操作和锁

const关键字

Wrapper当作一个自定义class
const 常量:const int kValue = 10;//不可更改
const 引用: void func(const Wrapper& w);//w不可更改
const 对象: const Wrapper w;//w对象只可以访问const成员函数
const成员函数: Wrapper::func() const;
const 指针:char * const; const char *;从右向左读即可知含义

在c++11后可以使用std::decay<T>::type忽略T的cv属性。

memmove vs memcpy

代码说话,memcopy对于重叠内存的行为是不可预计的,而memmove可以更好的处理这种情况,所以一般情况下memcopy效率高于memmove。

char[] str = "helloworld";
memcpy(&str[3], &str[4], 4); // undefined behavior

memmove(&str[3], &str[4], 4); // fine behavior
上一篇下一篇

猜你喜欢

热点阅读