什么是页缓存

我们知道文件一般存放在硬盘(机械硬盘或固态硬盘)中,CPU 并不能直接访问硬盘中的数据,而是需要先将硬盘中的数据读入到内存中,然后才能被 CPU 访问。

Read more »

内存分配的层面

  • c++ 内存分配相相关函数如下表所示。

    分配 释放 类属 可否重载
    malloc() free() C函数 x
    new delete C++表达式 x
    ::operator new() ::operator delete() C++函数
    allocator::allocate() allocator::deallocate() C++标准库 可自由设计并搭配任何容器
Read more »

简介

参考tcmalloc github官方文档
TCMalloc 是一种内存分配器,旨在替代系统默认分配器,具有以下特点:

  • 可以实现大多数对象的快速、无竞争的分配和释放。 对象被缓存,具体取决于模式,每个线程或每个逻辑 CPU。 大多数分配不需要锁定,因此多线程应用程序争用少,扩展性好。

  • 灵活使用内存,因此释放的内存可以重新用于不同的对象大小,或返回给操作系统。

  • 通过分配相同大小的对象的“页面”来降低每个对象的内存开销。小对象的空间损耗很少。

  • 低开销采样,可以详细了解应用程序内存使用情况。
    下面的框图显示了 TCMalloc 的粗略内部结构:

    Read more »

简介

jemalloc 是由 Jason Evans 在 FreeBSD 项目中引入的新一代内存分配器。它是一个通用的 malloc 实现,侧重于减少内存碎片和提升高并发场景下内存的分配效率,其目标是能够替代 malloc。jemalloc 应用十分广泛,在 Firefox、Redis、Rust、Netty 等出名的产品或者编程语言中都有大量使用。具体细节可以参考 Jason Evans 发表的论文 《A Scalable Concurrent malloc Implementation for FreeBSD》。

Read more »

虚函数内存模型

  • 我们可以用基类型A的引用或者指针持有实际类型为派生类B的对象,这意味着,编译时我们无法通过其声明类型来确定其实际类型,也就无法确定应该调用哪个具体的虚函数。考虑到程序中的每个函数都在内存中有着唯一的地址,我们可以将具体函数的地址作为成员变量,存放在对象之中,这样就可以在运行时,通过访问这个成员变量,获取到实际类型虚函数的地址。
    Read more »

private继承

  • 如果class之间的继承关系是private,那么编译器不会自动将一个子类对象转换为父类对象。
  • 使用private继承的所有父类成员,在子类中都是private类型的,即使成员在父类中是public或者protected的。
  • private意味着只有实现部分被继承,接口部分应略去。
  • private继承可以造成empty base最优化,如下代码
    Read more »

public继承==is_a关系

  • 如果class D 以public形式继承class B,那么相当于告诉c++编译器,每一个类型为D的对象同时也是一个类型为B的对象,反之不成立。

    Read more »

swap介绍

  • swap作为STL的一部分,在算法、容器、迭代器中被广泛使用。
    c++为用户定义了算法的默认形式如下:
    Read more »

能不能使用struct代替模板的class/typename

答: c++保留struct主要为了兼容c语言,但是在c语言中是不存在模板的,所有没有必要在模板中支持struct声明模板形参。

Read more »

编译器版本的默认构造/析构/赋值/拷贝构造函数

  • 当用户没有在类内声明上述三个函数时,如果程序中需要调用,编译器会为用户自动编写默认构造/析构/拷贝构造这三个重要的函数,即所谓的Big Three,和拷贝构造函数,并且这些函数都是inline的。在c++ 11后编译器新增了move构造和move赋值两个函数:
    Read more »