第 8 章:使用更好的库_《C++性能优化指南》_notes
使用更好的库
- 第八章核心知识点解析
- 编译与测试建议
- 总结优化原则
- 重点内容:
- 第一部分:多选题(10题)
- 第二部分:设计题
- 答案与解析
- 多选题答案:
- 设计题答案示例(部分):
- 测试用例设计原则:
第八章核心知识点解析
- 优化标准库的使用
知识点:选择合适的数据结构、预分配内存、减少拷贝
#include <vector>
#include <chrono>
#include <iostream>// 测试vector的reserve对性能的影响
void test_vector_reserve() {const int N = 1000000;// 不预分配内存{std::vector<int> v;auto start = std::chrono::high_resolution_clock::now();for(int i=0; i<N; ++i) {v.push_back(i);}auto end = std::chrono::high_resolution_clock::now();std::cout << "Without reserve: " << std::chrono::duration_cast<std::chrono::microseconds>(end-start).count()<< "μs\n";}// 预分配内存{std::vector<int> v;v.reserve(N);auto start = std::chrono::high_resolution_clock::now();for(int i=0; i<N; ++i) {v.push_back(i);}auto end = std::chrono::high_resolution_clock::now();std::cout << "With reserve: " << std::chrono::duration_cast<std::chrono::microseconds>(end-start).count()<< "μs\n";}
}int main() {test_vector_reserve();return 0;
}
输出示例:
Without reserve: 5432μs
With reserve: 1276μs
关键点:
reserve()
预分配内存避免多次重新分配- 减少内存分配次数可提升3-4倍性能
- 适用于vector、string等动态容器
- 优化现有库
知识点:添加批量处理接口
#include <vector>
#include <chrono>
#include <iostream>// 原始单元素处理接口
void process_element(std::vector<int>& vec, int value) {vec.push_back(value * 2);
}// 优化的批量处理接口
void process_batch(std::vector<int>& vec, const std::vector<int>& values) {vec.reserve(vec.size() + values.size());for(auto v : values) {vec.push_back(v * 2);}
}void test_batch_processing() {const int N = 10000;std::vector<int> input(N, 5);// 单次处理测试{std::vector<int> result;auto start = std::chrono::high_resolution_clock::now();for(auto v : input) {process_element(result, v);}auto end = std::chrono::high_resolution_clock::now();std::cout << "Single processing: " << std::chrono::duration_cast<std::chrono::microseconds>(end-start).count()<< "μs\n";}// 批量处理测试{std::vector<int> result;auto start = std::chrono::high_resolution_clock::now();process_batch(result, input);auto end = std::chrono::high_resolution_clock::now();std::cout << "Batch processing: " << std::chrono::duration_cast<std::chrono::microseconds>(end-start).count()<< "μs\n";}
}int main() {test_batch_processing();return 0;
}
输出示例:
Single processing: 856μs
Batch processing: 213μs
关键点:
- 批量处理减少函数调用开销
- 预分配内存进一步提升性能
- 接口设计要考虑使用场景
- 设计高效库
知识点:扁平化调用链
#include <chrono>
#include <iostream>// 深层次调用链
class DeepCallChain {
public:void level3(int x) { data = x * 2; }void level2(int x) { level3(x); }void level1(int x) { level2(x); }int get() const { return data; }
private:int data;
};// 扁平化调用链
class FlatCallChain {
public:void process(int x) { data = x * 2; }int get() const { return data; }
private: int data;
};void test_call_chain() {const int N = 1000000;// 深层次调用{DeepCallChain obj;auto start = std::chrono::high_resolution_clock::now();for(int i=0; i<N; ++i) {obj.level1(i);}auto end = std::chrono::high_resolution_clock::now();std::cout << "Deep call chain: " << std::chrono::duration_cast<std::chrono::microseconds>(end-start).count()<< "μs\n";}// 扁平调用{FlatCallChain obj;auto start = std::chrono::high_resolution_clock::now();for(int i=0; i<N; ++i) {obj.process(i);}auto end = std::chrono::high_resolution_clock::now();std::cout << "Flat call chain: " << std::chrono::duration_cast<std::chrono::microseconds>(end-start).count()<< "μs\n";}
}int main() {test_call_chain();return 0;
}
输出示例:
Deep call chain: 2563μs
Flat call chain: 1245μs
关键点:
- 减少函数调用层级
- 避免不必要的中间调用层
- 扁平调用提升约50%性能
- 避免动态查找
知识点:用直接访问替代查找
#include <vector>
#include <algorithm>
#include <chrono>
#include <iostream>void test_access_method() {const int N = 100000;std::vector<int> data(N);std::iota(data.begin(), data.end(), 0);// 查找方式访问{int sum = 0;auto start = std::chrono::high_resolution_clock::now();for(int i=0; i<N; ++i) {auto it = std::find(data.begin(), data.end(), i);if(it != data.end()) sum += *it;}auto end = std::chrono::high_resolution_clock::now();std::cout << "Find access: " << std::chrono::duration_cast<std::chrono::microseconds>(end-start).count()<< "μs\n";}// 直接索引访问{int sum = 0;auto start = std::chrono::high_resolution_clock::now();for(int i=0; i<N; ++i) {sum += data[i];}auto end = std::chrono::high_resolution_clock::now();std::cout << "Direct access: " << std::chrono::duration_cast<std::chrono::microseconds>(end-start).count()<< "μs\n";}
}int main() {test_access_method();return 0;
}
输出示例:
Find access: 12563μs
Direct access: 256μs
关键点:
- 查找操作时间复杂度O(n)
- 直接索引访问复杂度O(1)
- 性能差异可达50倍以上
编译与测试建议
- 使用C++11及以上标准编译:
g++ -std=c++11 -O2 example.cpp -o example
- 运行测试:
./example
- 典型优化效果对比:
- 内存预分配可提升3-5倍性能
- 批量接口比单次处理快2-4倍
- 扁平调用链比深层次快1.5-2倍
- 直接访问比查找快10-50倍
总结优化原则
- 预分配原则:对已知大小的容器使用reserve()
- 批量处理:设计支持批量操作的接口
- 扁平设计:减少不必要的调用层次
- 直接访问:用索引替代查找操作
- 内存重用:避免重复分配/释放内存
重点内容:
- 标准库性能特征与实现差异
- 自定义内存分配器的设计与应用
- 避免抽象惩罚的编程技巧
- 高效算法和数据结构的选择
- 字符串处理优化策略
- 模板元编程的性能影响
- 异常处理的开销控制
- 线程安全与性能平衡
- 缓存友好型数据结构设计
- 编译器优化选项的合理使用
第一部分:多选题(10题)
-
关于标准库容器的性能优化,以下哪些说法正确?
A) vector的push_back时间复杂度是O(n)
B) unordered_map的查找复杂度总是O(1)
C) deque在中间插入元素的时间复杂度是O(n)
D) list的迭代器失效规则与vector相同 -
下列哪些方法可以有效减少动态内存分配?
A) 使用对象池模式
B) 优先使用emplace_back代替push_back
C) 为string预先调用reserve()
D) 使用std::make_shared创建智能指针 -
关于字符串优化,哪些做法正确?
A) 小字符串优化(SSO)可以避免堆分配
B) 使用+=拼接比多次operator+更高效
C) 移动语义可以完全消除字符串拷贝
D) c_str()调用会触发深拷贝 -
以下哪些算法选择可能提升性能?
A) 用std::sort替代冒泡排序
B) 用std::lower_bound替代线性查找
C) 用std::list替代std::vector存储频繁修改的序列
D) 用std::array替代原始数组 -
关于内存分配器,正确的有:
A) 自定义分配器可以减少锁竞争
B) std::allocator是线程安全的
C) 内存池适合固定大小对象的分配
D) 对齐分配对SIMD指令很重要 -
哪些模板使用可能影响性能?
A) 深度嵌套的模板实例化
B) 递归模板元编程
C) 使用类型擦除的any类型
D) 模板参数推导失败 -
关于异常处理,正确的有:
A) 异常规范影响代码优化
B) try块会增加函数调用开销
C) noexcept声明帮助编译器优化
D) 异常捕获应尽量精确 -
缓存友好的设计包括:
A) 使用紧凑数据结构
B) 预取相邻内存数据
C) 随机访问链表节点
D) 对齐内存访问边界 -
编译器优化相关:
A) -O3可能增加代码体积
B) LTO优化链接时代码
C) PGO需要训练数据
D) restrict关键字帮助别名分析 -
线程安全优化策略:
A) 读写锁减少竞争
B) thread_local变量避免锁
C) 无锁数据结构消除等待
D) 原子操作总是比锁高效
第二部分:设计题
设计题1:高效字符串拼接
// 要求:实现零拷贝的字符串拼接,支持链式调用
class StringBuilder {
public:StringBuilder& append(const std::string& s);std::string build();
private:// 设计存储结构
};
设计题2:内存池分配器
// 实现固定块大小的内存池,支持STL容器
template <typename T>
class PoolAllocator {
public:using value_type = T;// 必要接口实现
};
设计题3:类型擦除优化
// 设计替代虚函数调用的高效多态方案
template <typename T>
class FunctionWrapper {
public:template <typename F>FunctionWrapper(F&& f);void operator()() const;
private:// 存储策略
};
设计题4:SIMD优化矩阵乘法
// 使用AVX指令优化4x4矩阵乘法
void matrix_multiply_avx(const float* a, const float* b, float* result);
设计题5:无锁队列
// 实现多生产者单消费者的无锁队列
template <typename T>
class LockFreeQueue {
public:void push(const T& value);bool pop(T& value);
private:// 设计节点结构和原子操作
};
答案与解析
多选题答案:
-
BC
C正确,deque中间插入O(n);B哈希表平均O(1)
A错,摊销O(1);D错,vector插入会使迭代器失效 -
ABCD
全部正确,B/D减少临时对象,A/C预分配 -
AB
C错,移动可能保留容量;D错,c_str()不触发拷贝 -
AB
C错,vector更适合随机访问;D类型安全但性能相同 -
ACD
B错,标准分配器线程安全但可能有锁 -
ABC
D是编译错误,不影响运行性能 -
ACD
B错,try块本身无运行时开销 -
ABD
C链表导致缓存不命中 -
ABCD
全部正确 -
ABC
D错,原子操作可能更慢
设计题答案示例(部分):
设计题1实现:
class StringBuilder {std::vector<std::reference_wrapper<const std::string>> parts;
public:StringBuilder& append(const std::string& s) {parts.emplace_back(s);return *this;}std::string build() const {size_t total = 0;for (const auto& s : parts) total += s.get().size();std::string result;result.reserve(total);for (const auto& s : parts) result += s.get();return result;}
};// 测试用例
int main() {StringBuilder sb;sb.append("Hello").append(" ").append("World");assert(sb.build() == "Hello World");
}
设计题2实现:
template <typename T>
class PoolAllocator {struct Block { Block* next; };Block* freeList = nullptr;public:T* allocate(size_t n) {if (n != 1 || !freeList) {return static_cast<T*>(::operator new(n * sizeof(T)));}auto head = freeList;freeList = freeList->next;return reinterpret_cast<T*>(head);}void deallocate(T* p, size_t n) {if (n != 1) {::operator delete(p);return;}auto block = reinterpret_cast<Block*>(p);block->next = freeList;freeList = block;}
};
剩下的设计题目, 后续补充
测试用例设计原则:
- 边界测试(空容器、最大容量)
- 并发测试(多线程竞争)
- 性能对比(与标准实现比较)
- 内存泄漏检测(Valgrind验证)
- 平台兼容性(不同编译器/架构)
相关文章:
第 8 章:使用更好的库_《C++性能优化指南》_notes
使用更好的库 第八章核心知识点解析编译与测试建议总结优化原则重点内容:第一部分:多选题(10题)第二部分:设计题答案与解析多选题答案:设计题答案示例(部分): 测试用例设…...
【面试八股】:常见的锁策略
常见的锁策略 synchronized (标准库的锁不够你用了)锁策略和 Java 不强相关,其他语言涉及到锁,也有这样的锁策略。 1. 悲观锁,乐观锁(描述的加锁时遇到的场景) 悲观锁:预测接下来…...
Apache Iceberg 解析,一文了解Iceberg定义、应用及未来发展
什么是 Iceberg? Apache Iceberg 是一种开源的 表格式(Table Format) ,专为超大规模数据分析场景设计,通过标准化数据存储规范与访问协议,解决了传统数据湖在元数据管理、事务控制、查询性能等方面的核心痛…...
Ubuntu 优化启动时间优化
优化 Ubuntu 20.04 的启动时间可以从多个方面入手,以下是详细的步骤和建议: 一、分析启动耗时 首先检查系统启动各阶段的耗时: systemd-analyze time # 查看整体启动时间 systemd-analyze blame # 列出各服务/进程的启动耗时 …...
【Git 常用指令速查表】
Git 常用指令速查表 Git 常用指令速查表目录1. 初始化仓库2. 提交代码流程3. 分支管理4. 远程仓库操作5. 撤销操作6. 查看状态与日志7. 其他实用指令完整操作示例常用场景速查表 Git 常用指令速查表 目录 初始化仓库提交代码流程分支管理远程仓库操作撤销操作查看状态与日志其…...
Linux实用操作及命令
一、各类小技巧(快捷键) 1、强制停止(ctrlc) Linux某些程序的运行,如果想要强制停止它,可以使用快捷键ctrl c 命令输入错误,也可以通过快捷键ctrl c,退出当前输入,重…...
洛谷 P10516 数据结构 Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an) 和 b ( b 1 , b 2 , ⋯ , b n ) b(b_1,b_2,\cdots,b_n) b(b1,b2,⋯,bn),有 m m m 个操作分三种: add ( l , r , k , t ) \operatorname{ad…...
在IDEA中使用TortoiseSVN
一、前言 原版SVN由于下载路径中没有svn.exe文件,导致IDEA中无法使用命令行提交项目代码,因此,现在卸载旧版本TortoiseSVN,下载附有svn.exe的新版TortoiseSVN,下载使用过程记录如下 二、下载过程 卸载就在 控制面板…...
基于 ffmpeg 实现合并视频
ffmpeg是一个强大的多媒体处理工具,支持视频文件的合并。 列出目录下所有MP4文件 import os import glob# 当前目录 directory os.getcwd() directory "/directory/to/mp4/*"# 列出目录下所有MP4文件 files glob.glob(directory)# 排序 files.sort(…...
如何在 HTML 中嵌入外部字体,有哪些注意事项?
大白话如何在 HTML 中嵌入外部字体,有哪些注意事项? 在 HTML 里嵌入外部字体,能让网页文字更有个性,瞬间提升页面的吸引力。下面就来详细说说怎么嵌入外部字体,以及其中的注意事项。 嵌入外部字体的方法 1. 使用 fo…...
三极管原理及应用
一、结构 基极(Base,符号:B) 基极是三极管的控制端,用于输入控制信号。通过基极电流的大小,可以控制集电极与发射极之间的电流导通程度,实现电流放大或开关功能。 发射极(Emitter&…...
三个串口同时打开并指定数据包控制指令思想
可以对嵌入式串口数据包指令设置做一次总结: 首先确定你的数据包大小,传统的接收串口数据到数组存储会出现需要循环遍历数组去读取数据的弊端,所以我设计了一个机制,只有当你想要读取外界指令时,才开始读取外界发过来…...
“征服HTML引号恶魔:“完全解析手册”!!!(quot;表示双引号)
🚨📢 "征服HTML引号恶魔:“完全解析手册” 📢🚨 🎯 博客引言:当引号变成"恶魔" 😱 是否遇到过这种情况: 写HTML时满心欢喜输入<div title"他…...
MQL5教程 04 脚本开发实战、指标开发基础
文章目录 一、脚本开发实战1、给脚本设置快捷键2、运行时显示输入参数界面3、开市价单4、一键平仓5、修改止盈止损6、一键删除当前图表所有挂单 二、指标开发基础 一、脚本开发实战 1、给脚本设置快捷键 在MT5导航栏中,选定脚本,鼠标右击 → 设置热键 …...
【Qt】Ubuntu22.04使用命令安装Qt5和Qt6
1、安装Qt5 注意:Ubuntu22.04已经没有 qt5-default ,因此不能一键安装啦 1)安装核心组件 sudo apt install qtbase5-dev qtchooser qt5-qmake qtcreator2)安装QtCreator sudo apt install qtcreator3)安装工具包、Qt Quick 开发的核心库(qtdeclarative5-dev) sudo a…...
海康设备http监听接收报警事件数据
http监听接收报警事件数据 海康获取设备报警事件数据两种方式: 1、sdk 布防监听报警事件数据(前面文章有示例) 2、http监听接收报警事件数据 http监听接收报警事件数据,服务端可以使用netty通过端口来监听获取事件数据。 WEB 端…...
【MVCC快照如何实现】
MVCC(多版本并发控制)快照的实现原理 MVCC(Multi-Version Concurrency Control)是现代数据库实现事务隔离级别的核心技术,它通过数据多版本和快照机制来实现高效的并发控制。下面我将详细解析MVCC快照的实现机制。 一、MVCC核心组件 1. 版本链结构 MVCC通过以下…...
STM32中不同FLASH的芯片启动文件选择规则
F103ZET6的FLASH大小是512K,所以选择startup_stm32f10x_hd.s F103C8T6的FLASH大小是64K,所以选择startup_stm32f10x_md.s 移植需要注意的事项: 从ZET6到C8T6,需要更改 1)启动文件 2)C/C选项卡...
树莓集团商业模式解析:树莓集团是国企吗?
树莓集团作为中国市场的重要企业实体,其所有制性质一直受到业界关注。从公开资料显示,树莓集团并非传统意义上的国有企业,而是一家具有混合所有制特征的现代化企业集团。其股权结构中既包含国有资本成分,也吸纳了社会资本和民营投…...
mock.js模拟数据
MOCK模拟后端数据 1.按照mock.js npm install mockjs2.在src目录下建立mock目录,在该目录下建立index.js文件,该文件中写上你所需要的数据,示例如下: import Mock from mockjs let data Mock.mock("/data/person",&…...
如何自动规整化(格式化)HTML
如果你想要自动规整化(格式化)HTML,可以使用以下方法: 方法 1:使用 VS Code 进行 HTML 格式化(推荐) 步骤 安装 Visual Studio Code打开你的 HTML 文件按下 Shift Alt F(Windows…...
MySQL数据库入门
目录 前言 一、安装软件 二、普通指令使用 三、MySQL接口API相关函数 1、API函数使用步骤 2、mysql_init-MYSQL对象初始化 3、mysql_real_connect()——数据库引擎建立连接 4、mysql_close()——关闭数据库连接 5、mysql_query()——查询数据库某表内容 6、mysql_stor…...
SpringBoot集成Couchbase开发与实践
1 前言 1.1 什么是Couchbase Couchbase 是一个高性能的 NoSQL 数据库,支持文档存储、内存缓存和分布式计算。它结合了内存数据库的速度和灵活性与传统数据库的持久性和查询能力。 1.2 Couchbase的特点与优势 高性能:利用内存缓存加速数据访问。可扩展性:支持水平扩展,能…...
一周掌握Flutter开发--8. 调试与性能优化(上)
文章目录 8. 调试与性能优化核心技能8.1 使用 Flutter DevTools 分析性能8.2 检查 Widget 重绘(debugPaintSizeEnabled)8.3 解决 ListView 卡顿(ListView.builder itemExtent) 其他性能优化技巧8.4 减少 build 方法的调用8.5 使用…...
动态路由机制MoE专家库架构在多医疗AI专家协同会诊中的应用探析
随着医疗人工智能技术的飞速进步,AI在医学领域的应用日益增多,尤其是在复杂疾病的诊断和治疗中,AI技术的应用带来了巨大的潜力。特别是动态路由机制混合专家(Mixture of Experts,MoE)架构,因其灵活、高效的特点,正逐渐成为实现多AI专家协同会诊的关键技术。通过将多个不…...
Linux上位机开发实践(开源框架和开源算法)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 做嵌入式软件开发,如果软件本身比较简单,只是图形界面显示,那么相关的开发工作并不难。最主要的内容也就是数据…...
算法时间复杂度分析
1. 基本概念 大 O 符号 O(f(n)) 表示算法的最坏情况复杂度,即算法在最不利情况下所需的基本操作数不会超过 O(f(n))的级别。例如,表示当输入规模 n 增大时,算法运行时间上界是某个常数乘以 。 Ω 符号 Ω(f(n)) 表示算法的下界,即…...
数据库基础知识点(系列五)
创建表,设置约束,修改表,删除表,表中数据的操作(insert,修改,删除) 1.在第5章习题创建的 “仓库库存”数据库中完成下列操作。 (1)创建“商品”表,表结构如表6-4: 表6-4 “goods”…...
C++中使用ShellExecute函数调用其他窗口程序时,参数设置为隐藏,后续能通过发消息给这个被调用程序显示,能显示出来窗口吗
文章目录 一、可行性分析二、实现步骤1. 启动程序并隐藏窗口2. 获取目标窗口句柄3. 发送消息显示窗口方法1:发送WM_SHOWWINDOW方法2:发送WM_SYSCOMMAND恢复窗口方法3:直接调用ShowWindow(推荐) 三、代码示例四、关键注…...
使用 AI 生成 页面
当前使用的是 火山引擎 提供的 deepseek-v3-241226 思考 如何让AI可以按自己的想法一步步生成页面? 我们要把要生成的内容分段的给到它,让它按步聚完成。 如生成一个列表页 依据所定义的接口。生成API依赖定义接口 生成 状态管理模块依赖上状态管理…...
【人工智能】机器学习中的评价指标
机器学习中的评价指标 在机器学习中,评估指标(Evaluation Metrics)是衡量模型性能的工具。选择合适的评估指标能够帮助我们更好地理解模型的效果以及它在实际应用中的表现。 一般来说,评估指标主要分为三大类:分类、…...
shell脚本运行方式 bash 和./区别
在 Linux 或 macOS 这类基于 Unix 的系统里,使用 ./ 运行脚本和使用 bash 运行脚本存在一些差异,下面为你详细说明: 1. 语法与使用方式 使用 ./ 运行脚本: 若要使用 ./ 来运行脚本,需要确保脚本文件具备可执行权限&a…...
ShardingSphere+达梦数据库分表操作
背景 随着数字经济时代的全面到来,数据量呈现爆炸式增长,传统单机数据库在性能、扩展性和可用性方面面临严峻挑战。分布式数据库技术应运而生,成为解决海量数据存储与处理的关键方案。在这一背景下,Apache ShardingSphere作为一款…...
WordPress上传图片时显示“未提供数据”错误
在WordPress中上传图片时显示“未提供数据”的错误,通常是由多种原因引起的,以下是一些常见的问题及其解决方法: 1. 文件权限问题 WordPress需要正确的文件和目录权限才能正常上传图片。如果权限设置不正确,可能会导致无法上传图…...
AP CSA FRQ Q2 Past Paper 五年真题汇总 2023-2019
Author(wechat): bigshuang2020 ap csa tutor, providing 1-on-1 tutoring. 国际教育计算机老师, 擅长答疑讲解,带学生实践学习。 热爱创作,作品:ap csa原创双语教案,真题梳理汇总, AP CSA FRQ专题冲刺, AP CSA MCQ小题…...
海量数据场景题--查找两个大文件的URL
查找两个大文件共同的URL 给定 a、b 两个文件,各存放 50 亿个 URL,每个 URL 各占 64B,找出 a、b 两个文件共同的 URL。内存限制是 4G。 操作逻辑: 使用哈希函数 hash(URL) % 1000 将每个URL映射到0-999的编号 文件A切割为a0, a1…...
Spring AI Alibaba 工具(Function Calling)使用
一、工具(Function Calling)简介 Spring AI Alibaba工具(Function Calling):https://java2ai.com/docs/1.0.0-M6.1/tutorials/function-calling/ 1、工具(Function Calling) “工具(Tool)”或“功能调用(Function Calling…...
汽车方向盘开关功能测试的技术解析
随着汽车智能化与电动化的发展,方向盘开关的功能日益复杂化,从传统的灯光、雨刷控制到智能语音、自动驾驶辅助等功能的集成,对开关的可靠性、耐久性及安全性提出了更高要求。本文结合北京沃华慧通测控技术有限公司(以下简称“慧通…...
9-100V输入替代CYT5030/LM5030高压双路电流模式PWM控制器
产品描述: PC3530高压 PWM 控制器包含实现推挽和桥式拓扑所需的所有功能,采用电流模式控制,提供两个交替栅极驱动器输出。PC3530内置高压启动稳压器,可在 9V~100V 的宽输入电压范围内工作。芯片内部还集成有误差放大器、精密基准、两级过流保…...
详细讲解c++中线程类thread的实现,stl源码讲解之thread
Thread 本节我们来详细介绍一下c中的线程类thread,在讲解的过程中会用到大量模板的知识,可以去看c详解模板泛型编程,详解类模板的实现为什么不能放在cpp文件_泛型函数 cpo-CSDN博客 源码: template <class _Fn, class... _Args, enable_…...
PostgreSQL详解
第一章:环境部署与基础操作 1.1 多平台安装详解 Windows环境 图形化安装 下载EnterpriseDB安装包(含pgAdmin) 关键配置项说明: # postgresql.conf优化项 max_connections 200 shared_buffers 4GB work_mem 32MB 服务管理命…...
系统思考—第五项修炼
感谢【汇丰】邀请,为其高阶管理者交付系统思考系列项目。这不仅是一次知识的传递,更是一次认知的升级。 系统思考,作为《第五项修炼》的核心能力,正在帮助越来越多的管理者突破碎片化决策的困局,建立看见全貌的智慧与…...
如何使用QuickAPI生成带参数的数据API(基于原生SQL)
目录 一、示例表结构 二、准备工作 三、创建带参数的数据API 步骤 1:登录 QuickAPI 平台 步骤 2:连接数据库 步骤 3:配置基础信息 步骤 4:编写 SQL 并添加参数 步骤 5:测试并发布API 步骤 6:验证A…...
RHINO 转 STL,解锁 3D 打印与工业应用新通道
一、RHINO 格式介绍 RHINO 是一款功能强大的三维建模软件,其对应的文件格式(.3dm)能够精确地存储复杂的三维模型数据。它支持多种几何类型,包括 NURBS(非均匀有理 B 样条曲线)、多边形网格等。这种格式的优…...
PySide6属性选择器设置样式避坑
总所周知,Qt中qss语法支持属性选择器,通过setProperty设置key和value,支持在多种样式之前切换。今天使用了一下PySide6的属性选择器,发现了一个问题。完整代码见最后。 首先,先写一段qss样式,用来设置按键样…...
BKA-CNN-BiLSTM、CNN-BiLSTM、BiLSTM、CNN四模型多变量时序光伏功率预测,附模型报告
BKA-CNN-BiLSTM、CNN-BiLSTM、BiLSTM、CNN四模型多变量时序光伏功率预测,附模型报告 目录 BKA-CNN-BiLSTM、CNN-BiLSTM、BiLSTM、CNN四模型多变量时序光伏功率预测,附模型报告预测效果基本介绍程序设计参考资料 预测效果 基本介绍 BKA-CNN-BiLSTM、CNN-…...
ADS 学习和培训资源 - Keysight ADS
在 Signal Edge Solutions,我们是 Keysight ADS 的忠实用户,因此我们明白,使用和学习这款强大的仿真工具有时可能非常困难。 因此,我们编制了一份清单,列出了一些我们最喜欢的 ADS 学习和培训资源,以帮助您…...
【leetcode刷题记录】(java)数组 链表 哈希表
文章目录 四、题目之:代码随想录(1) 代码随想录:数组[704. 二分查找](https://leetcode.cn/problems/binary-search/)[27. 移除元素](https://leetcode.cn/problems/remove-element/)暴力解:双指针: [977. 有序数组的平方](https://leetcode.…...
ngx_http_core_root
定义在 src\http\ngx_http_core_module.c static char * ngx_http_core_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {ngx_http_core_loc_conf_t *clcf conf;ngx_str_t *value;ngx_int_t alias;ngx_uint_t …...
大模型在支气管肺癌预测及临床决策中的应用研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的 二、大模型预测支气管肺癌的原理与技术基础 2.1 大模型简介 2.2 数据收集与预处理 2.3 模型训练与优化 三、术前预测 3.1 病情评估 3.1.1 肿瘤大小、位置及分期预测 3.1.2 转移风险预测 3.2 手术风险预测 3.2.1 患…...