当前位置: 首页 > news >正文

C++ 现代教程二

线程支持库 - C++中文 - API参考文档

GitHub - microsoft/GSL: Guidelines Support Library

Fluent C++:奇异递归模板模式(CRTP) - 简书


#include <thread>
#include <iostream>
#include <unordered_map>
#include <future>
#include <functional>// atomic 有两个功能:原子 & 内存序
// 原子的作用:保证对一个变量操作期间,其他线程不会对此变量操作,那就称为原子操作
// 内存序的作用:构造一个事件发生先后的顺序关系// 大多数普通的变量都不用是原子的,只有一个变量被多个线程同时访问(且其中一个是有副作用的写访问)时,才需要把它变成原子变量
// 所有其他变量,如果也设为原子的话,CPU 的压力会非常大,必须时时刻刻提心吊胆,编译器也会难以优化
// 我们只需要把少数多个线程同时访问的变量设为原子的就可以,帮 CPU 和编译器明确哪些是需要保证多线程并发访问安全的//  x86 TSO
// CPU,缓存,编译器优化 -> 导致乱序
// 对少数关键变量的内存访问,指定内存序,可以阻断优化,避免这些关键变量的乱序
// 而普通的无关紧要的变量的访问依然可以乱序执行// seq_cst = Sequentially-Consistent 顺序一致模型,总是保证所有内存操作,在所有线程看起来都是同一个顺序
// acquire = 我命令你,如果另一个线程对该变量 release 过,请把他的修改对我当前线程可见
// release = 我命令你,之前当前线程的所有写入操作,必须对所有对该变量 acquire 的线程可见
// acq_rel = acquire + release
// relaxed = 无内存序,仅保证原子性
// https://www.apiref.com/cpp-zh/cpp/thread.html
void testAtomic() {// 保证原子性std::atomic_int flag = 0;std::packaged_task<int()> task([&]() {std::cout << "start from thread" << std::endl;while (flag.load(std::memory_order_relaxed) == 0) // 2 ldr [data];std::cout << "end from thread" << std::endl;return 0;});// get the future of taskstd::future<int> result = task.get_future();    // run task in a threadstd::thread(std::move(task)).detach();result.wait_for(std::chrono::seconds(1));std::cout << "waiting..." << std::endl;//flag.fetch_add(1, std::memory_order::relaxed);  // +=flag.store(1, std::memory_order_relaxed); // 1 str [data]  // =result.wait(); // block until future has arrived// 不相等保存,相等时不操作,更高性能int oldVal = flag.load(std::memory_order_acquire), newVal = 0;while (!flag.compare_exchange_weak(oldVal, newVal, std::memory_order_seq_cst, std::memory_order_relaxed))  // compare_exchange_strong;
}/* cpp  CRTP 模式自动实现 clone
template <class Derived>
struct Pet {void feed() {Derived* that = static_cast<Derived*>(this);that->speak();}
};struct CatPet : Pet<CatPet> {void speak() {puts("Meow!");}
};struct DogPet : Pet<DogPet> {void speak() {puts("Bark!");}
};
*/// 组件模式
struct GameObject;
struct Component {virtual void update(GameObject* go) = 0;virtual ~Component() = default;  // 注意!
};struct GameObject {std::unordered_map<uint64_t, Component*> components;template <class ImplementT>void add(Component* component) {components.emplace_back(getTypeID<ImplementT>, component);}void update() {//for (auto&& c : components) {//	c->update(this);//}}template <class ImplementT>uint64_t getTypeID() {return typeid(ImplementT).hash_code();}template <class T>const T* getComponent() {auto matched = components.find(getTypeID<T>());if (matched == components.end())return nullptr;return static_cast<const T*>(matched->second.get());}
};//MVC 模式是一种架构模式,它将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller),通过分离应用程序的输入、处理和输出来提高应用程序的可维护性和可扩展性。
//
//- 模型(Model):负责处理数据和业务逻辑,通常由数据结构和数据库组成。
//- 视图(View):负责展示数据和用户界面,通常由 HTML、CSS 和 JavaScript 组成。
//- 控制器(Controller):负责处理用户交互和调度模型和视图,通常由后端语言(如 PHP、Java 等)实现。// C++20 开始
// Student stu{.name = "小彭老师", .age = 24, .id = 9999};// 在 map 中使用 `[]` 查找元素,如果不存在,会自动创建一个默认值// 多返回值用结构体替换,禁用tuple
struct from_chars_result {const char* ptr;int ec;
};from_chars_result from_chars(const char* first, const char* last, int& value);// 常量数组传参
//template <class Arr>
//concept has_data_size = requires (Arr arr) {
//	{ arr.data() } -> std::convertible_to<char*>;
//	{ arr.size() } -> std::same_as<size_t>;
//};struct Span {
char* data;
size_t size;template <size_t N>
Span(char(&buf)[N]) : data(buf), size(N) {}
template <size_t N>
Span(std::array<char, N>& arr) : data(arr.data()), size(N) {}Span(std::vector<char>& vec) : data(vec.data()), size(vec.size()) {}// 如果有需要,也可以显式写出 Span(buf, 30) 从首地址和长度构造出一个 Span 来
explicit Span(char* data, size_t size) : data(data), size(size) {}//template <has_data_size Arr>
//Span(Arr&& arr) : data(arr.data()), size(arr.size()) {}Span subspan(size_t start, size_t length = (size_t)-1) const {if (start > size)  // 如果起始位置超出范围,则抛出异常throw std::out_of_range("subspan start out of range");auto restSize = size - start;if (length > restSize) // 如果长度超过上限,则自动截断length = restSize;return Span(data + start, restSize + length);
}
};template <class B>
struct GunWithBullet {static_assert(is_base_of<Bullet, B>::value, "B 必须是 Bullet 的子类");
};// finally
template <class Callback>
struct Finally {Callback func;bool valid;Finally() : func(), valid(false) {}Finally(Callback func) : func(func), valid(true) {}Finally(Finally&& that) noexcept : func(std::move(that.func)), valid(that.valid) {that.valid = false; // 如果要支持移动语义,必须有个 bool 变量表示空状态!}Finally& operator=(Finally&& that) noexcept {if (this != &that) {if (valid) {func();}func = std::move(that.func);valid = that.valid;that.valid = false;}return *this;}void cancel() {valid = false;}void trigger() {if (valid) {func();}valid = false;}~Finally() {if (valid) {func();}}
};template <class Callback> // C++17 CTAD
Finally(Callback) -> Finally<Callback>;// https://github.com/microsoft/GSL   指针区分
void test() {Finally cb = [] {std::cout << ("调用了 Finally 回调") << std::endl;};std::shared_ptr<void> dtor(nullptr, [](void*) {std::cout << "test ~ctor" << "\n"; });testAtomic();
}

输出

start from thread
waiting...
end from thread

其它

CRTP (Curiously Recurring Template Pattern / 奇异递归模板模式)。基类模板参数包含派生类型的,这种就是传说中的 CRTP。包含派生类型是为了能调用派生类的某些函数
decltype(a)   返回 A const &
std::decay_t<decltype(a)>   返回 A

参考

现代 C++ 使用教程-CSDN博客

- [C++ 官方文档](https://en.cppreference.com/w/)
- [C++ 核心开发规范](https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md)
- [Effective Mordern C++ 中文版](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/4.SmartPointers/item22.md)
- [热心观众整理的学习资料](https://github.com/jiayaozhang/OpenVDB_and_TBB)
- [HackingCpp 图文教程](https://hackingcpp.com/)
- [LearnCpp 基础教程](https://www.learncpp.com/cpp-tutorial/)
- [LearnCpp 中文版](https://learncpp-cn.github.io/)
- [Performance Analysis and Tuning on Modern CPUs](http://faculty.cs.niu.edu/~winans/notes/patmc.pdf)
- [C++ 并发编程实战](https://www.bookstack.cn/read/Cpp_Concurrency_In_Action/README.md)
- [深入理解计算机原理 (CSAPP)](http://csapp.cs.cmu.edu/)
- [并行体系结构与编程 (CMU 15-418)](https://www.bilibili.com/video/av48153629/)
- [因特尔 TBB 编程指南](https://www.inf.ed.ac.uk/teaching/courses/ppls/TBBtutorial.pdf)
- [CMake “菜谱”](https://www.bookstack.cn/read/CMake-Cookbook/README.md)
- [CMake 官方文档](https://cmake.org/cmake/help/latest/)
- [Git 官方文档](https://git-scm.com/doc)
- [GitHub 官方文档](https://docs.github.com/en)
- [实用网站 CppInsights 解构 C++ 语法糖](https://cppinsights.io)
- [实用网站 GodBolt 查看不同编译器生成的汇编](http://godbolt.org)


创作不易,小小的支持一下吧!

相关文章:

C++ 现代教程二

线程支持库 - C中文 - API参考文档 GitHub - microsoft/GSL: Guidelines Support Library Fluent C&#xff1a;奇异递归模板模式&#xff08;CRTP&#xff09; - 简书 #include <thread> #include <iostream> #include <unordered_map> #include <futu…...

JavaScript函数闭包解析

一、什么是闭包 JavaScript中的函数闭包是指函数可以访问其父级作用域中的变量&#xff0c;即使函数在父级作用域外被调用。闭包可以获取和修改其父级作用域中的变量&#xff0c;即使父级作用域已经被销毁。 在JavaScript中&#xff0c;当一个函数被定义时&#xff0c;它会创…...

STM32MP135裸机编程:使用软件触发硬件复位

0 参考资料 STM32MP13xx参考手册.pdf 1 使用寄存器实现软件复位 1.1 复位电路概述 重点关注下面标红的路线&#xff1a; 通过这条路线可以清楚看到&#xff0c;我们可以通过设置RCC_MP_GRSTCSETR寄存器让RPCTL&#xff08;复位脉冲控制器&#xff09;给NRST&#xff08;硬件复…...

【饼图交通方式】用ECharts的graphic配置打造个性化

利用ECharts的graphic配置打造个性化图表 内容概要 ECharts是一款强大的数据可视化工具&#xff0c;它提供了丰富的配置选项来定制图表。本文将重点介绍graphic配置的使用&#xff0c;展示如何通过在饼图中添加个性化的图形元素&#xff0c;例如中心图像&#xff0c;来增强图…...

大模型学习笔记3【大模型】LLaMA学习笔记

文章目录 学习内容LLaMALLaMA模型结构LLaMA下载和使用好用的开源项目[Chinese-Alpaca](https://github.com/ymcui/Chinese-LLaMA-Alpaca)Chinese-Alpaca使用量化评估 学习内容 完整学习LLaMA LLaMA 2023年2月&#xff0c;由FaceBook公开了LLaMA&#xff0c;包含7B&#xff0…...

工程师 - 什么是SMP

什么是 SMP&#xff08;对称多处理&#xff09;&#xff1f; What is SMP (symmetric multiprocessing)? 对称多处理&#xff08;SMP&#xff0c;symmetric multiprocessing&#xff09;是由多个处理器完成的计算机处理过程&#xff0c;这些处理器共享一个操作系统&#xff0…...

Webpack: 并行构建

概述 受限于 Node.js 的单线程架构&#xff0c;原生 Webpack 对所有资源文件做的所有解析、转译、合并操作本质上都是在同一个线程内串行执行&#xff0c;CPU 利用率极低&#xff0c;因此&#xff0c;理所当然地&#xff0c;社区出现了一些以多进程方式运行 Webpack&#xff0…...

Vue的介绍与使用

1.Vue的介绍 内容讲解 【1】Vue介绍 1.vue属于一个前端框架&#xff0c;底层使用原生js编写的。主要用来进行前端和后台服务器之间的一个交互。 2.Vue是一套构建用户界面的渐进式前端框架。 “渐进式框架”简单的来说你可以将Vue作为你的应用一部分嵌入其中&#xff0c;代理…...

MYSQL双主双从,使用Keepalived双机热备+LVS高可用群集

MYSQL双主双从&#xff0c;使用Keepalived双机热备LVS高可用群集 ​ 文档只记录KeepalivedLVSmysql主从&#xff0c;不包含检验&#xff0c;如需检验&#xff0c;请自行添加web服务器 一、IP规划 服务器IP备注master1192.168.100.131master2的从master2192.168.100.132maste…...

9.计算机视觉—目标检测

目录 1.物体检测边缘框目标检测数据集总结边缘框代码实现2.锚框:目标检测的一种方法IoU—交并比赋予锚框标号使用非极大值抑制(NMS)输出总结代码实现1.物体检测 边缘框 一个边缘框可以通过四个数字定义 (左上x,左上y),(右下x,右下y)(左上x,左上y,宽,高)(中间x,中间y…...

构造函数深入理解

目录 构造函数构造函数体赋值初始化列表初始化列表格式初始化列表的意义以及注意点const修饰的成员变量初始化对象成员具体初始化的地方缺省值存在的意义例子1例子2 初始化与赋值引用成员变量的初始化注意点1注意点2我的疑惑 自定义类型成员初始化例子1例子2例子3例子4 初始化列…...

Rocky Linux 9 快速安装docker 教程

前述 CentOS 7系统将于2024年06月30日停止维护服务。CentOS官方不再提供CentOS 及后续版本&#xff0c;不再支持新的软件和补丁更新。CentOS用户现有业务随时面临宕机和安全风险&#xff0c;并无法确保及时恢复。由于 CentOS Stream 相对不稳定&#xff0c;刚好在寻找平替系统…...

go语言并发编程1-Gouroutine

参考文档&#xff1a;www.topgoer.com 使用方法 直接包装成函数&#xff0c;go关键字触发即可 注意事项 1 main方法结束后&#xff0c;main方法内启动的子协程会立即结束&#xff0c;无论是否执行完毕&#xff1b; 启动多个groutine 使用sync包的WaitGroup来控制&#xf…...

Sylar服务器框架——Http模块

1、http.h 定义了HttpMethod和HttpStatus /* Request Methods */ #define HTTP_METHOD_MAP(XX) \XX(0, DELETE, DELETE) \XX(1, GET, GET) \XX(2, HEAD, HEAD) \XX(3, POST, POST) \XX(4, PUT, …...

7km远距离WiFi实时图传模块,无人机海上无线传输方案,飞睿智能WiFi MESH自组网技术

在浩瀚无垠的海洋上&#xff0c;无人机正在开启一场前所未有的技术创新。它们不再只是天空的舞者&#xff0c;更是海洋的守望者&#xff0c;为我们带来前所未有的视野和数据。而这一切的背后&#xff0c;都离不开一项创新性的技术——飞睿智能远距离WiFi实时图传模块与无线Mesh…...

2024年上半年网络工程师下午真题及答案解析

试题一(20分) 某高校网络拓扑如下图所示&#xff0c;两校区核心&#xff08;CORE-1、CORE-2&#xff09;&#xff0c;出口防火墙&#xff08;NGFW-1、NGFW-2&#xff09;通过校区间光缆互联&#xff0c;配置OSPF实现全校路由收敛&#xff0c;两校区相距40km。两校区默认由本地…...

Jmeter下载、安装及配置

1 Jmeter介绍 Jmeter是进行负载测试的工具&#xff0c;可以在任何支持Java虚拟机环境的平台上运行&#xff0c;比如Windows、Linux、Mac。 Jmeter模拟一组用户向目标服务器发送请求&#xff0c;并统计目标服务器的性能信息&#xff0c;比如CPU、memory usage。 2 Jmeter下载 …...

掌握高效实用的VS调试技巧

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 1.编程常见的错误 1.1编译型错误 编程编译型错误是指在编译代码时发现的错误。编译器在编译过程中会检查代码是否符合语法规范和语义要求&#xff0c;如果发现错误会产生编译错误。 直接看错误提示信息&#xff08;双击&#…...

实验2 字符及字符串输入输出与分支程序设计实验

字符及字符串输入输出 从键盘输入两个一位十进制数&#xff0c;计算这两个数之和&#xff0c;并将结果在屏幕上显示出来。 分支程序设计 从键盘输入一字符&#xff0c;判断该字符是小写字母、大写字母、数字或者其他字符。若输入为小写字母&#xff0c;显示“You Input a Lo…...

docker容器间网络仿真工具-pumba

docker-tc&pumba docker-tc:docker-tc项目仓库 pumba:pumba项目仓库 这两个项目理论上都可以实现对容器间的网络环境进行各种模拟干预&#xff0c;包括延迟&#xff0c;丢包&#xff0c;带宽限制等。 但是我在实际使用时&#xff0c;发现docker-tc这个工具在进行网络进行模…...

A36 STM32_HAL库函数 之PCD通用驱动 -- B -- 所有函数的介绍及使用

A36 STM32_HAL库函数 之PCD通用驱动 -- B -- 所有函数的介绍及使用 1 该驱动函数预览1.11 HAL_PCD_SOFCallback1.12 HAL_PCD_ResetCallback1.13 HAL_PCD_SuspendCallback1.14 HAL_PCD_ResumeCallback1.15 HAL_PCD_ISOOUTIncompleteCallback1.16 HAL_PCD_ISOINIncompleteCallbac…...

vue2 + element三级菜单实现模板

需求&#xff1a; 需要一个含有三级菜单的结构模板&#xff0c;用于业务快速开发。 解决&#xff1a; sidebar.vue <template><el-menu :default-active"defaultActive" class"el-menu-vertical-demo" active-text-color"#ffd04b"&…...

vue H5页面video 视频流自动播放, 解决ios不能自动播放问题

视频组件 <videostyle"width: 100%; height: 100%;object-fit: fill"class"player"refplayer_big_boxcontrolspreloadautoplay //自动播放muted //是否静音playsinline"true"x5-playsinline""webkit-playsinline"tru…...

自闭症儿童:探索症状背后的多彩内心世界

在星启帆自闭症康复中心&#xff0c;我们每天与一群独特而珍贵的孩子相遇——他们&#xff0c;是自闭症谱系障碍的患儿。自闭症&#xff0c;这一复杂的神经发育障碍&#xff0c;以其多样化的症状表现&#xff0c;为每个孩子的生活轨迹绘上了不同的色彩。 自闭症孩子的症状各异…...

在Centos7上安装PostgreSQL16的详细步骤

文章目录 环境一、准备二、postgresql下载方法一&#xff1a;wget下载方法二&#xff1a;下载压缩包解压 三、创建用户组、用户四、创建数据主目录五、配置环境变量六、initdb初使化数据库七、配置服务八、设置开机自启动九、设置防火墙十、启动数据库服务 环境 CPU: 4 核心或以…...

MySQL 图形化界面

填完信息之后&#xff0c;圆圈处可以验证是否可以连接数据库 展示所有数据库&#xff08;因为有的可能连上&#xff0c;却没有数据库显示&#xff09;...

【人工智能】GPT-5的即将到来:从高中生进化到,,,博士生?

GPT-5的即将到来&#xff1a;从高中生进化到,博士生&#xff1f; 随着近月GPT-4o的出世&#xff0c;OpenAI也在进行一系列的采访和介绍接下来的展望和目标。 在6月22日的采访中&#xff0c;美国达特茅斯工程学院公布了OpenAI首席技术官米拉穆拉蒂的访谈内容。穆拉蒂确认&#…...

【收录率高丨投稿范围广 | 往届均已EI检索】第四届光学与通信技术国际学术会议(ICOCT 2024,8月9-11)

欢迎参加第四届光学与通信技术国际学术会议&#xff08;ICOCT 2024&#xff09;&#xff0c;该会议将于2024年8月9-11日在南京举办。自2021年首次会议以来&#xff0c;ICOCT已经发展成为光学和通信领域较有影响力的国际会议之一&#xff0c;聚焦最前沿的技术进展与未来发展趋势…...

小阿轩yx-LVS负载均衡群集

小阿轩yx-LVS负载均衡群集 构建群集服务器—通过整合多台服务器使用 LVS 达到服务器的高可用和负载均衡并以同一个 IP 地址对外提供相同的服务 LVS 群集应用基础 群集称呼来自英文单词“Cluster”在服务器领域则表示大量服务器的集合体&#xff0c;区分单个服务器 Cluster …...

CPP知识点记录总结

1、类的const成员函数 const成员函数的const 实际修饰的是该成员函数隐含的this指针&#xff0c;表明在该成员函数中不能对类的任何成员进行修改。 class A {void fun() const {// 常成员函数&#xff0c;在函数名后用const修饰} } 一文带你入门C类和对象【十万字详解&#…...