美文网首页C++
C++语言基础

C++语言基础

作者: this_is_for_u | 来源:发表于2019-08-16 22:53 被阅读0次

    extern关键字作用

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

    static关键字

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

    • static成员变量:作用域为当前类,需在类外初始化(const static 貌似c++11不需要类外初始化),统一一下还是都类外初始化比较好。
    • static局部变量:作用域为当前函数,只初始化一次,分配在全局数据区
    • static全局变量:作用域为当前文件,在头文件中定义static,引用此头文件的都会有该static变量的一份拷贝,静态变量不能被其它文件所用,即不能配合extern使用
    • static成员函数:可以避免和全局函数符号冲突,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
    

    相关文章

      网友评论

        本文标题:C++语言基础

        本文链接:https://www.haomeiwen.com/subject/gdhdlctx.html