C++ Linux 系统调用
前置知识:[[标准IO]] 详细系统调用请查阅man手册 open() 打开文件 123456789101112131415# include <unistd.h> // close函数# include <fcntl.> // open函数# include <stdio.h>int main(int argc, char* argv[]){ int fd = open("./dict.txt",O_RDONLY); // 以只读模式打开dict.txt,参数里面是字母O,不是数字0 // int fd = open("./dict.txt",O_RDONLY|O_CREAT, 0644); // 创建并打开文件dict.txt,设置权限为:rw-r--r-- if(fd==-1) { printf("file open error!"); } close(fd); // 关闭文件描述符 return 0;} close() ...
TCP和UDP协议
TCP协议 UDP协议
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. 该参数也可以...
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。
C++ 内存对齐
C++ 内存对齐
内存序
什么是内存序 内存顺序是指在并发编程中, 对内存读写操作的执行顺序。这个顺序可以被编译器和处理器进行优化, 可能会与代码中的顺序不同, 这被称为指令重排.