Skip to content

enum 和 enum class

enum class 带有作用域, 转换为int时需要使用static_cast()

cast

  • dynamic_cast

使用场景: 将基类指针转为派生类指针,便于调用派生类特有方法

在运行时去做转换而非编译时, 转换不成功则返回NULL

Base* b = new Derived();
b->Func();
// 安全转换
Derived* d = dynamic_cast<Derived*>(b);
if (d != NULL) {
    d->NewFunc();
}
  • static_cast

使用场景: void指针转为其他类型指针, 派生类指针转换为基类指针

避免使用static_cast将基类指针转换为派生类指针,因为无运行时类型检查,不安全

static_cast < type-id > ( expression )
  • const_cast

使用场景: 移除const属性

std::string value;
char* name = const_cast<char*>(value.c_str()),

malloc

malloc (multi-threaded heap uses critical sections) new scalable_malloc

https://andylin02.iteye.com/blog/724095 缓存边界对齐,防止多线程频繁导致的缓存刷新

new 和 new (std::nothrow)

new 在内存分配失败时,会抛出异常类型std::bad_alloc。 new (std::nothrow) 在内存分配失败时,不会抛出异常,而是返回NULL Task * ptask = new (std::nothrow) Task;

虚函数和纯虚函数

纯虚函数, 基类不能实例化 虚函数, 基类指针多态

派生类调用基类的虚函数,在派生类中使用基类的域访问符号即可调用基类的虚函数

移动构造和拷贝构造

https://zh.cppreference.com/w/cpp/language/move_constructor

编译器自动生成移动构造函数的条件:

没有用户声明的复制构造函数;
没有用户声明的复制赋值运算符;
没有用户声明的移动赋值运算符;
没有用户声明的析构函数;

编译器没有自动生成移动构造函数时, 参数为右值时或使用std::move转换参数,仍然会调用拷贝构造

RVO和NRVO

RVO(返回值优化)

NRVO(具名返回值优化)

返回值会优先匹配移动构造进行返回

函数重载

函数名

返回值

参数列表

const

仅当const参数是一个引用或指针时,C++才允许基于const类型进行函数重载

#include<iostream>
using namespace std;

void fun(const int i)
{
    cout << "fun(const int) called ";
}
void fun(int i)
{
    cout << "fun(int ) called " ;
}
int main()
{
    const int i = 10;
    fun(i);
    return 0;
}
error: redefinition of ‘void fun(int)’

json

JSON String Escape

https://www.freeformatter.com/json-escape.html#ad-output

Json Parser Online

http://json.parser.online.fr/

redis

# --raw 显示中文问题
redis-cli -h <ip> -p <port> -a <password> --raw
# 查看redis信息 
info


哈希表

key 表示一个哈希表

# 写操作: HSET写入单个域, HMSET写入多个域
HSET key field value
HMSET key field value [field value …]

# 读操作:HGET读出单个域, HMGET读出多个域, HGETALL读出所有域
HGET key field
HMGET key field [field …]
HGETALL key


# 哈希表key中域的个数
HLEN key

redis 模式

主从模式

Redis Sentinel (哨兵模式)

Redis Sentinel 本身也是redis, 可以通过redis-cli进行连接, 但其上存储的是redis主从配置信息,一般不存储生产数据

# 获取sentinel有多少个master, 及每个master的名称, 每个master对应一个redis主从服务
INFO Sentinel

# 获取master_name对应的redis主从服务的master主机ip和端口
SENTINEL get-master-addr-by-name <master_name>

# 获取master_name对应的redis主从服务的slaves的从机ip和端口(可能有多个)
SENTINEL slaves <master_name>

kafka

topic(主题)

partition(分区) 一个broker上可以存储多个分区的数据, 每个分区对应一个文件夹, 每个partition上存在多个segment, 每个segment对应两个文件(数据文件和索引文件)

consumer group(消费组) 每个消费组能

consumer(消费者) 一个消费组里消费者合作消费信息 一个消费者可以消费多个分区 消费者的数目需要小于等于分区数,否则会有消费者空闲 一个线程只能有一个消费者, 消费者不是线程安全的

查看topic信息

bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic my-replicated-topic

版本管理, 配置重加载

tensorflow_serving/core/source.h Source 数据新版本监控