概念

  • 引用不是新定义一个变量,而是给一个已经存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
    Read more »

const关键字

  • const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。
    Read more »

内存不够怎么办

在早起的计算机上,程序是运行在物理内存上的,也就是说,程序在运行时所访问的地址都是物理地址,那么在多个进城同时运行的过程中,如何将计算机上有限的物理内存分配给多个程序使用是一个值得思考的问题。
一个比较直接的做法是在物理内存上直接进行分配,例如我们计算机有128M的内存,程序A运行需要10M,程序B需要100M,程序C需要20M,如果我们同时运行A和B,就将内存前10M给A,10~110M给B,但是这种方法存在的隐患却是很大的:

  1. 地址空间不隔离:任何程序都可以直接访问物理地址,那么恶意的程序很容易修改其他程序的内存数据。
  2. 内存使用率低:没有有效的内存管理机制,需要一个程序执行时,监控程序就将整个程序装入内存中然后开始执行。如果我们忽然需要运行一个程序C,这时候内存空间不够了,我们只释放A的内存空间是不够的,因此需要将B移到磁盘,这中间有大量的数据换入患处,导致效率十分低下。
  3. 程序运行的地址不确定:程序每次需要装入运行时,我们都需要给它在内存中分配一块足够大的空闲区域,每个空闲区域的位置是不确定的,给程序的编写造成了一定的麻烦。因为程序在编写时,访问数据和指令跳转的目标地址都是固定的,这设计到了程序的重定位问题。
    Read more »

乐观锁和悲观锁

  1. 定义
    • 乐观锁:每次获取数据的时候,都不会担心数据被修改,所以每次获取数据的时候都不会进行加锁,但是在更新数据的时候需要判断该数据是否被别人修改过。如果数据被其他线程修改,则不进行数据更新,如果数据没有被其他线程修改,则进行数据更新。由于数据没有进行加锁,期间该数据可以被其他线程进行读写操作。
    • 悲观锁:每次获取数据的时候,都会担心数据被修改,所以每次获取数据的时候都会进行加锁,确保在自己使用的过程中数据不会被别人修改,使用完成后进行数据解锁。由于数据进行加锁,期间对该数据进行读写的其他线程都会进行等待。
      Read more »

  1. BIOS启动

    • 上电自检,对设备的硬件进行一系列测试。
    • 初始化硬件设备。
    • 搜索一个操作系统来启动。
    • 找到一个有效的设备,就把第一个扇区的内容拷贝到RAM中,从物理地址0x00007c00开始的位置,跳转到这个地址上,开始执行刚才装载的代码。
      Read more »

redis选择什么存储方式存储时间序列?

  • 使用场景:高并发写,低频率读。因此需要插入数据快,不能阻塞。
  • Redis适用的结构:Hash、Sorted Set以及基于RedisTimesSeries的模块实现。
    Read more »

关于C++的一些误解

  1. 关于C++默认构造函数的一些误解
    Read more »

编译器何时生成默认构造函数?

编译器生成的构造函数只适用于编译器的正确性,类内的数据初始化不由编译器负责!

  1. 如果一个class内部含有一个成员对象,并且这个对象有默认构造函数,那么编译器就会为这个class生成默认构造函数。
  2. 此class继承自一个含有默认构造函数的基类。
  3. 带有virtual function的Class或者继承了一个含有virtual fuction的父类。
  4. 使用了虚继承的类。
    存在两个误解:
  5. 任何class如果没有定义默认构造,编译器会生成。(错,编译器只会在需要的时候生成)
  6. 编译器生成的默认构造会明确初始化。(错,编译器不会初始化成员变量,这是程序设计者的活!)
    Read more »