socket编程
基本函数和结构体 创建socket int socket(int domain, int type, int protocol) 成功返回0;失败返回-1,同时设置错误代码errno。 单个进程能够创建socket连接的数量受系统参数open files的限制(使用ulimit -a查看)。因为socket在Linux中也是文件 domain:通信协议族 PF_INET:ipv4协议族 PF_INET6:ipv6协议族 PF_LOCAL:本地通信的协议族 PF_PACKET:内核底层的协议族 PF_IPX:IPX Novel协议族 其余协议族不常用 type:数据传输的类型 SOCK_STREAM:面向连接的socket, 数据不会丢失 数据顺序不会错乱 双向通道 SOCK_DGRAM:无连接的socket, 传输效率更高 数据可能丢失 数据顺序可能错乱 protocal:最终使用的协议 在ipv4协议族中,数据传输方式为SOCK_STREAM的协议只有IPPROTO_TCP,数据传输方式为SOCK_DGRAM的协议只有IPPROTO_UDP. 该参数也可以...
C++新标准
C++新标准 C++ 11 语法特性: auto decltype 返回类型后置(auto+decltype) 右值引用 列表初始化 移动语义(std::move) 万能引用(T&&) 智能指针(share_ptr; wake_ptr; unique_ptr) 范围for循环 委托构造函数 继承构造函数 final和override default 函数delete explicit constexpr 强类型枚举(enum class) 原始字符串字面量 基于范围的for循环 lambda表达式 内联命名空间 右>的优化 noexcept char32_t和char16_t 库特性: chrono库 thread库 std::function std::bind std::move std::forword:与万能引用配合使用 std::array std::to_string() std::tuple(元组) std::tie std::ref std::make_shared 无序容器: std::unordered_map std::unor...
C++语法
C++语法 强制类型转换 static_cast 用于基本数据类型之间的转换,以及在类层次结构中基类和派生类之间的指针或引用的转换。它在编译时执行,不提供运行时类型检查。 如果对象所属的类重载了强制类型转换运算符 T(如 T 是 int、int* 或其他类型名),则 static_cast 也能用来进行对象到 T 类型的转换。 static_cast 不能用于在不同类型的指针之间互相转换,也不能用于整型和指针之间的互相转换,当然也不能用于不同类型的引用之间的转换。因为这些属于风险比较高的转换。 例: 123int a = 10;int b = 3;double result = static_cast<double>(a) / static_cast<double>(b); dynamic_cast 用于类层次结构中的指针和引用的转换,它在运行时检查类型的安全性。它要求转换的类型必须包含至少一个虚函数。 如果转换失败,dynamic_cast会返回nullptr。 例: 1234class Base {};clas...
STL-map
map 存储 key-value,==key唯一== 底层:红黑树。红黑树参考:RBTree 是否有序:有序(key升序) unordered_map 存储key-value,==key唯一== 底层:哈希表。 是否有序:无序 multimap 存储key-value,==key不唯一==(一个key对应多个value) 底层:红黑树。 是否有序:有序(key升序) unordered_multimap 存储key-vlaue,==key不唯一==(一个key对应多个value) 底层:哈希表。 总结: 带有unordered就是哈希表,没有unordered就是红黑树 带有multi就是可重复key 横向对比 有序用树,高速用哈希,重复用multi,唯一用map 特性 map multimap unordered_map unordered_multimap 底层结构 红黑树(平衡二叉搜索树) 红黑树 哈希表(Hash Table) 哈希表 元素顺序 有序(默认升序) 有序 无序 无序 键唯一性 唯一 可重复 唯一 可重复 插入...
STL-set
set 集合。存储指定的类型:std::set<int> mySet;. 横向对比 特性 set multiset unordered_set unordered_multiset 底层结构 红黑树(平衡二叉搜索树) 红黑树 哈希表(Hash Table) 哈希表 元素顺序 有序(默认升序) 有序 无序 无序 元素唯一性 唯一 可重复 唯一 可重复 插入/查找时间复杂度 O(log n) O(log n) O(1)(平均),O(n)(最坏) O(1)(平均),O(n)(最坏) 迭代器稳定性 稳定(除删除元素外) 稳定 不稳定(rehash时失效) 不稳定 内存占用 较低(树结构紧凑) 较低 较高(需预分配哈希桶) 较高 适用场景 需有序遍历或范围查询 需有序且允许重复 高频查找且无需顺序 高频插入/删除且允许重复
shared_lock
shared_lock 专门用于管理 std::shared_timed_mutex 或 std::shared_mutex 的共享锁。它简化了获取和释放共享锁的操作,并提供了一些附加功能,比如延迟锁定、超时锁定等。 成员函数: shared_lock(): 创建一个未锁定的shared_lock。 shared_lock(mutex_type& m): 创建一个shared_lock 并尝试锁定给定的mutex_type(std::shared_timed_mutex 或 std::shared_mutex)。如果锁定失败,则抛出异常。 shared_lock(mutex_type& m, std::defer_lock_t t): 创建一个未锁定的 shared_lock,但关联到给定的mutex_type。 shared_lock(mutex_type& m, std::try_to_lock_t t): 尝试锁定给定的 mutex_type,如果成功则锁定,否则创建一个未锁定的shared_lock。 shared_lock(mutex_type...
shared_timed_mutex
shared_timed_mutex 共享超时互斥锁(具备超时功能的读写锁) 成员函数: lock_shared(): 获取==共享锁==,如果当前有独占锁,则阻塞。 try_lock_shared(): 尝试获取共享锁,如果成功则返回true,否则返回false,不阻塞。 try_lock_shared_for(duration): 尝试在指定的时间段内获取共享锁,如果成功则返回true,否则返回false。 lock(): 获取==独占锁==,如果当前有共享锁或独占锁,则阻塞。 try_lock(): 尝试获取独占锁,如果成功则返回true,否则返回false,不阻塞。 try_lock_for(duration): 尝试在指定的时间段内获取独占锁,如果成功则返回true,否则返回false。 unlock(): 释放当前持有的锁(无论是共享锁还是独占锁)。
C++ nodiscard
nodiscard 用于标记函数的返回值: [[nodiscard]] int Compute(); 当调用该函数却不赋值返回结果时,将收到警告: 123void Foo() { Compute();} 1warning: ignoring return value of 'int Compute()', declared with attribute nodiscard 标记整个类型 1234[[nodiscard]]struct ImportantType {};ImportantType CalcSuperImportant(); 每当调用任何返回ImportantType的函数时,都会收到警告。 使用注意 过多使用该关键字可能导致编译器编译时出现大量warning。
内存序
什么是内存序 内存顺序是指在并发编程中, 对内存读写操作的执行顺序。这个顺序可以被编译器和处理器进行优化, 可能会与代码中的顺序不同, 这被称为指令重排.
原子操作
原子操作