
CPP
文章平均质量分 77
saddlesad
这个作者很懒,什么都没留下…
展开
-
levelDB布隆过滤器实现分析
levelDB布隆过滤器实现布隆过滤器是这样一个数据结构,它可以用来判断某些元素是否可能已存在(于下一层的存储介质中);它可能把不存在的元素误认为已存在,但不会把已存在的元素误认为不存在。所以如果布隆过滤器认为一个元素不存在,那么它就真的不存在,如果它认为一个元素已存在,那么它只是可能存在。原理布隆过滤器的底层是一个位数组结构。每次add一个元素,布隆过滤器都将使用k个哈希函数对此元素分别计算得到k个哈希值,哈希值模位数组长度的结果对应位数组中一个位置,然后布隆过滤器将这k个位置都置为1.每次fi原创 2022-01-16 10:40:46 · 393 阅读 · 0 评论 -
protobuf底层编码格式一览
protobuf底层编码格式首先要认识protobuf支持的几种编码方式和它们对应的数据类型:wire-typemeaningused for0varintint32, int64, uint32, uint64, sint32, sint64, bool, enum164-bitfixed64, sfixed64, double2length-delimitedstring, bytes, embedded messages, packed repeate原创 2021-11-27 18:01:37 · 1124 阅读 · 0 评论 -
内存对齐和alignof,alignas
内存对齐和alignof,alignas内存对齐的原因:某些硬件平台不支持对未对齐对象的访问对齐后,访问效率更高内存对齐要求:任何K字节的基本对象的地址必须是K的倍数。为了实现这个要求,结构体中会有一些填充字节,即padding;另外,结构体的末尾可能也需要一些填充,这样结构体数组中的每个结构体元素都会满足对齐要求,即alignment。举例说明:struct S1 { int i; // size: 4 char c; // size: 1 // 3 bytes pad原创 2021-11-24 10:57:20 · 693 阅读 · 0 评论 -
一文看懂C++ lambda表达式
原文链接:https://mp.weixin.qq.com/s?__biz=MzkxMzI5NDI2OA==&mid=2247483663&idx=1&sn=5270c0c75ca260935215d615129a261b&chksm=c17e97dcf6091eca30a4f998e4cb878ed35bf5b1d597aeb7b78f4b188bfcc9f12d80d26fb084&token=1767427365&lang=zh_CN#rd前言C++原创 2021-10-19 14:14:00 · 492 阅读 · 0 评论 -
C++类的特种函数生成机制
C++类的特种函数生成机制规则参考Effective Morder C++上的说明:默认构造函数:仅当类中不包含用户声明的构造函数时才生成。析构函数:默认生成,当基类的析构函数为虚时,派生类的默认析构函数为虚函数。拷贝构造函数:仅当类中不包含用户声明的拷贝构造函数时才生成。如果该类声明了移动操作,那么拷贝构造函数将被定义为删除的。拷贝赋值运算符:仅当类中不包含用户声明的拷贝赋值运算符时才生成。如果该类声明了移动操作,那么拷贝赋值运算符将被定义为删除的。移动构造函数和移动赋值运算符:仅当类中不原创 2021-09-13 13:35:43 · 715 阅读 · 1 评论 -
RVO返回值优化
RVO返回值优化标准Copy Elision拷贝省略,即避免函数返回值对象或者传递参数为值对象时触发复制 / 移动构造函数。RVO即Return Value Optimization,是针对返回值的Copy Elision,可细分为NRVO(Named Return Value Optimization,具名返回值优化)和URVO(Unknown Return Value Optimization,匿名返回值优化)。C++17之前,标准对此行为没有规定,但大多数编译器都默认开启两项优化,可以添加编译原创 2021-08-31 17:18:31 · 367 阅读 · 0 评论 -
C++程序退出机制
C++程序退出机制从几个std函数入手分析:std::exit,用于正常流程退出,由用户显式调用。(main()函数返回 = 调用main内部局部变量的dtor + std::exit(0))。std::terminate,用于异常流程退出,一般由库函数调用。std::abort,直接终止程序。其中只有std::exit()函数会执行清理动作,比如调用析构函数和执行std::atexit注册过的函数。另外,std::asssert()断言失败时会输出错误信息 + 调用std::abort()原创 2021-08-23 21:10:50 · 9774 阅读 · 1 评论 -
muduo中的reactor模式实现浅析
muduo中的reactor模式实现浅析最近刚刚看完了陈硕大神的《Linux多线程服务端编程》,对muduo源码也略有阅读,故作此总结。Reactor模型先来看看定义:The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs. The service ha原创 2021-08-19 14:03:57 · 809 阅读 · 0 评论 -
探查C++ name mangling
什么是name mangling?C++编译器会为代码中的每个函数签名生成全局唯一的名字,以方便后续定位和引用,这个名字是由函数名和函数参数组合而成的,不考虑返回值(这是合理的,因为在cpp语法中:函数签名相同但返回值不同的函数声明被认为是具有二义性的非法声明)。怎么查看mangled name?可以使用nm工具探查编译后的目标文件:g++ -c t.cppnm t.o如果t.cpp中这么写:int foo(bool x) { return 42;}int foo(int x)原创 2021-08-02 13:29:00 · 803 阅读 · 0 评论 -
std::future和std::async,std::packaged_task,std::promise的交互
std::future和std::async,std::packaged_task,std::promise的交互std::future是C++标准库对一次性事件的表述,而std::async,std::packaged_task,std::promise是三种驱动异步任务的方式,三者各有方法返回一个对应的std::future,调用方可以使用它来获取返回值。std::async(一般)会立即在另一个线程中执行任务,std::packaged_task会在主动调用operator()时在另一线程中执行任原创 2021-07-15 17:02:13 · 192 阅读 · 0 评论 -
C++Primer二刷重要知识点总结
时隔半年,最近开始第二遍看C++ Primer,发现自己之前有很多理解不透彻的语法细节或STL库使用,故写下此博客以做总结。第二章—占坑–原创 2021-03-08 14:19:28 · 204 阅读 · 4 评论