分类 编程语言 下的文章

一、YouCompleteMe介绍

YouCompleteMe(简称YCM)是一款vim的智能补全插件,支持C/C++, Go, Python...等多种代码类型补全。

它强大的功能吸引了不少人的使用,但有无数人因为安装它“折腰”,因为它的安装过程确实很麻烦。

花了一个下午的时间,来回装了两次,终于算是勉强搞定。

首先假定你已经安装好了vim和对应的插件管理器:升级安装vim 8.0并添加vundle插件管理

要注意的是,vim编辑器要求编译的时候添加了python支持。

根据测试,选择python2支持会比python3省事一些,因为后面安装cmake的时候貌似只能使用python2(具体是不是这样没有去深入研究,目前暂且按python2的来)。

先上一张效果图:

- 阅读剩余部分 -

一、构造函数的执行规则

C++构造函数的调用顺序为:

  1. 如果类中包含静态成员变量,先执行静态成员变量的构造函数。
  2. 如果类是派生类,则先执行基类的构造函数。同样如果基类也是一个派生类,也要先执行基类的构造函数。
  3. 执行成员变量中的构造函数,根据定义的顺序来,先执行类内初始化,再执行列表初始化。
  4. 执行本类的构造函数。

- 阅读剩余部分 -

逗号表达式时c语言提供一种特殊的运算符,优先级别最低,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。

例如:

#include <iostream>
using namespace std;

int main() {
    int a = (1 + 2, 2 + 3);
    cout << a << endl;
    a = (a * 5, a + 6);

    return 0;
}

输出的结果为:

5
11

一、默认初始化

C++中,对于定义时没有指定初值的变量,将会被默认初始化,此时变量将被赋予“默认值”,默认值是具体是什么将由变量的类型和位置决定。

对于内置类型来说,它的默认值由定义的位置决定,定义于函数体外的变量(即全局变量)被初始化为0,定义于函数体内的局部变量将不被初始化,值是未定义的。

- 阅读剩余部分 -

一、进程状态

通常情况下,我们描述进程的状态主要有三种:

  • 就绪态:进程已经拥有了执行条件,但是没有获取到CPU,无法执行。
  • 运行态:进程已经占有了CPU,此时正在CPU上运行。
  • 阻塞态:进程在等待某项服务、信号或者外部操作等时候的状态。

三者之间的转化过程:

状态说明:

  1. 就绪 => 运行:进程被调度,获得运行时机。
  2. 运行 => 就绪:运行时间片到了,CPU让出给其他进程运行。
  3. 运行 => 阻塞:请求服务、信号、IO或是外部操作等场景。
  4. 阻塞 => 就绪:获得了输入条件,如收到信号以及读到磁盘数据等。

为什么阻塞态到就绪态和运行态之间不能相互转化

进程处于阻塞态被唤醒时,不能直接就抢占到CPU执行,而是要等待系统调度后才能继续运行,所以必须先放到就绪态中。而处于就绪态的进程,是没有运行的,状态是不会变化的,所以不能直接变成阻塞态。

在大多数的操作系统描述中,进程可能还存在新建和终止的状态,他们之间的转态变化为:

二、linux系统中的进程状态

linux系统中的进程可以分为以下几种状态:

  • 可运行态

    • 就绪态:等待被调度
    • 运行态:正在运行
  • 阻塞态

    • 浅阻塞:可中断,能被信号或时钟唤醒
    • 深阻塞:不可中断,不能被信号或时钟唤醒
  • 僵死态:进程执行中止,已经释放了大部分资源
  • 挂起态:进程被挂起,常出现在调试场景