c++模板—SFINAE机制
SFINAE原则:在模板匹配失败后不会直接报编译错误,而是继续匹配其他模板。我们能利用这个特征来确定某个类型是否有一个特定的成员、支持一个特定的操作或是一个类。
SFINAE函数重载
我们利用SFINAE函数重载来确认某个类型是否拥有默认构造函数。
template<class T>struct IsDefaultConstructibleT {private: // test()尝试替换为U传递的T的默认构造函数调用 template<class U, class = decltype(U())> static char test(void*); // test()回退 template<class> static long test(...);public: static constexpr bool value = std::is_same_v<decltype(test<T>(nullptr)), char>;};struct S { S() ...
Redis—对象
redis对象
redis中的每个对象都由redisObject结构表示:
typedef struct redisObject { // 类型 unsigned type:4; // 编码 unsigned encoding:4; // 指向底层实现数据结构的指针 void *ptr; // ...} robj;
类型常量
对象名称
REDIS_STRING
字符串对象
REDIS_LIST
列表对象
REDIS_HASH
哈希对象
REDIS_SET
集合对象
REDIS_ZSET
有序集合对象
redis对象可能使用的底层实现。
类型
编码
对象
REDIS_STRING
REDIS_ENCODING_INT
使用整数值实现的字符串对象
REDIS_STRING
REDIS_ENCODING_EMBSTR
使用embstr编码的简单动态字符串实现的字符串对象
REDIS_STRING
REDIS_ENCODING_RAW
使用简单动态字符串实现的字符串对象
...
Redis—数据结构
redis中数据结构
简单动态字符串SDS
双端链表
字典(哈希表)
跳表
整数集合
压缩列表
简单动态字符串
sds的结构如下,对c字符串进行简单封装,类似c++中的string。
struct sdshdr { // 记录buf数组中已使用字节的数量 // 等于SDS所保存字符串的长度 int len; // 记录buf数组中未使用字节的数量 int free; // 字节数组,用于保存字符串 char buf[];};
相比c字符串,sds存在下述优势:
常数复杂度获取字符串长度
避免缓冲区溢出,会自动扩容
减少修改字符串带来的内存重新分配次数
空间预分配:sds长度小于1MB(len属性的值),则分配同样大小的未使用空间(free的值);如果sds长度大于1MB,那么分配1MB的未使用空间。
惰性空间释放:当sds需要缩短字符串长度,不会立马释放多余的空间,而是通过修改free的值来记录。
二进制安全:redis不是用这个数组来保存字符,而是保存一系列二进制数据
兼容部分c字符串函数
双端链表
节点结 ...
shell学习—网络监听
netstat
lsof
结构型模式—组合模式
目的
组合模式允许用相同的方式处理单个对象或对象的组合体。使用组合模式的场景基本涉及到树形结构。
UML类图
实例分析
我们以在一个画布上绘图为例。需要画圆、正方形、圆+正方形的组合,我们希望能用同一个接口来操作组合图的绘制过程,而不是我们先画一个圆,再画一个正方形。这里就可以使用组合模式进行处理。
我们首先创建一个图形结构的基类,提供一个绘图接口:
class Graphic {public: virtual void draw() = 0;};
接着创建能绘制基础图形的派生类,这里创建一个圆和一个点:
#include <iostream>#include "graphic.h"class Circle : public Graphic {public: void draw() { std::cout << "draw circle" << std::endl; }};class Dot : public Grap ...
结构型模式—代理模式
目的
代理模式是一种结构型设计模式,提供对原对象的替代品,代理控制着对原对象的访问,同时能够在访问对象的前后做一些额外的处理。
UML类图
实例分析
这里以代理律师的实例进行说明。LawSuit是一个抽象类(纯虚类),提供了一个submit的虚函数接口。
#pragma once#include <iostream>class LawSuit {public: virtual void submit(std::string& proof) = 0;};
两个子类Student和ProxyLawyer都需要实现这个接口。
#pragma once#include "law_suit.h"class Student : public LawSuit {public: void submit(std::string& proof) { std::cout << "这是相关证据:" << proof << std::endl ...
c++11—thread
c++11提供了线程及其相关操作的库,可以很方便的支持并发编程。
线程的使用
std::thread是c++11提供的线程类,不可拷贝,只支持移动语义,相比于pthread_t使用起来非常方便。
支持的构造函数:
thread() noexcept;thread( thread&& other ) noexcept;template< class Function, class... Args >explicit thread( Function&& f, Args&&... args );thread( const thread& ) = delete;
简单的用例:
#include <iostream>#include <thread>void print() { std::cout << "hello world" << std::endl;}int main() { std::thread t(pri ...
c++template_second_book
from: https://github.com/r00tk1ts/cpp-templates-2nd?tab=readme-ov-file
方便个人阅读。
第12章 深入模板基础
在本章中,我们将深入探讨本书第一部分中介绍的一些基础知识:模板的声明,模板参数(template paramenters)的限制(restrictions),模板实参(template arguments)的限制(constraints)等等。
12.1 参数化声明
C++目前支持4种基础模板:类模板、函数模板、变量模板以及别名模板。每一种模板都既可以出现在命名空间作用域,也可以出现在类作用域。在类作用域中,它们作为嵌套的类模板、成员函数模板、静态数据成员模板以及成员别名模板。这些模板的声明与普通类、函数、变量以及类型别名(或者是它们的类成员副本)非常相似,只不过需要一个形如template<parameters here>的子句来做前置指引。
请注意,C++17引入了另一种带有参数化子句的结构:推导指引(deduction guides)(参考P42节2.9以及P314节15.12.1)。本书 ...
c++11—type_traits
类型萃取即对类型进行操作,例如获取类型的名称、去除类型的修饰符、增加“类型”的修饰符。c++11的头文件#include <type_traits>中提供了很多的类模板帮助我们对类型进行萃取。下面对一些常见的类型萃取进行说明。
常量的萃取
integral_constant
用于获取某个类型静态常量,声明如下:
template<class T, T v>struct integral_constant;
这里额外提供了两个bool的常量值std::true_type和std::false_type,标准库中的声明如下,这两个常量对于其他萃取器的实现有非常大作用:
typedef integral_constant<bool, true> true_type;typedef integral_constant<bool, false> false_type;
类型种类的萃取
这种萃取能帮助我们判断一个类型是否是整形还是浮点型等。
is_integral
判断一个类型是否是整形,声明如下:
template<class T>st ...
读《人生》有感
高加林在高中毕业后成为了代课教师,过着他想要的小县城的生活。可好景不长,他的位置被明楼所顶替,他又成为了农民,他需要上地里去干活,对于他这个没怎么下地干过活的人来说,土地里不仅意味着辛苦,更意味着他那一眼能看到头的未来,这对他精神上的折磨远超肉体。但苦日子没过多久,加林因为一些缘故又被安排到县组织部工作,写起了稿子,加林在这里如鱼得水,大展身手,他的未来一片光明。后面他和黄亚萍在一起后,亚萍给他画饼说带他去大城市南京,那里是更宽广的天地,任他高加林遨游。可后面“加林被安排到县委工作一事”被人举报,南京梦碎了,连县城也待不下去,加林又回到了生他养他的土地。这就是人生,变化莫测,你永远不知道明天和意外哪一个先来。正如书中所描述的:
生活在一瞬间就发生了巨大的转折!村里人对这类事已经麻木了,因此谁也没有大惊小怪。高加林教师下了当农民,大家不觉得奇怪,因为高明楼的儿子高中毕业了。高加林突然又在县上参加了工作,大家也不奇怪,因为他的叔父现在当了地区的劳动局长。他们有时也在山里骂现在社会上的一些不正之风,但他们的厚道使他们仅限于骂骂而已。还能怎样呢?