- 博客(145)
- 收藏
- 关注
原创 哪些函数不能被声明为虚函数?
函数类型是否支持 virtual备注说明构造函数❌ 不支持没有多态机制时机析构函数✅ 推荐使用防止基类指针释放派生对象资源泄漏静态成员函数❌ 不支持无对象上下文,无法动态分发非成员函数 / 友元函数❌ 不支持不是成员,无虚表普通成员函数✅ 支持主要用于实现多态成员模板函数✅ 支持(不常用)模板实例化后作为成员函数存在。
2025-07-25 17:04:48
200
原创 static函数是否可以声明成虚函数?
特性是否支持 virtual说明构造函数❌ 不支持构造阶段没有 vtable静态函数❌ 不支持static 函数不依赖对象,无 vtable析构函数✅ 推荐使用允许通过基类指针正确释放派生对象资源成员函数✅ 支持支持多态,依赖对象 vtable 动态分发调用。
2025-07-25 17:01:53
178
原创 构造函数是否可以声明成虚函数?
特性是否可以是虚函数原因构造函数❌ 不可以构造阶段对象未完整建立,vptr 不安全析构函数✅ 可以(推荐)支持通过基类指针释放派生类对象,避免资源泄漏。
2025-07-25 16:59:05
423
原创 vector如何判断应该扩容?
项目vector 行为说明扩容时机扩容代价重新分配内存 + 拷贝/移动旧元素扩容策略指数增长(一般为 1.5 或 2 倍)控制扩容reserve(n)提前分配空间避免多次扩容注意事项扩容后地址可能变化,旧引用/指针可能失效。
2025-07-25 16:55:24
417
原创 Lambda 捕获方式
捕获方式说明适用场景值捕获[x]复制外部变量,lambda 内部独立需要变量快照,防止外部修改影响引用捕获[&x]捕获变量引用,访问的是外部变量本体需要修改外部变量,或变量较大避免复制隐式捕获[=]按值捕获所有外部变量简单只读场景隐式捕获[&]按引用捕获所有外部变量需要修改或大对象避免复制移动捕获C++14起支持,移动对象所有权到lambda内管理资源(unique_ptr等)
2025-07-25 16:49:21
231
原创 拷贝构造和移动构造的区别是什么?
使用一个已有对象来复制初始化一个新对象。会将资源(如内存)复制一份,两个对象拥有各自独立的资源。使用一个右值(临时对象或将亡值)来**“移动”资源**,而不是复制。把资源的所有权从other转移给新对象,other被置为“空”或安全状态。极大提升性能,避免不必要的内存分配和复制。方面拷贝构造移动构造参数类型const T&T&&作用复制资源,两个独立对象转移资源,避免复制资源管理申请新资源,复制数据直接“偷走”资源指针,无需申请性能相对较慢,涉及深拷贝。
2025-07-25 16:34:14
224
原创 函数f(int a,int b),a和b的地址关系?
函数调用时,参数是从右往左压栈的(cdecl调用约定)。第一个参数a最后入栈,位于栈顶(高地址)。第二个参数b先入栈,位于栈底(低地址)。栈顶(高地址)| 参数 a 地址 | ← &a| 参数 b 地址 | ← &b栈底(低地址)参数顺序地址关系(典型x86)&b < &a(后面的参数地址更低)
2025-07-25 16:31:17
247
原创 虚函数和纯虚函数
类型概念特点是否可调用用法场景虚函数virtual基类中定义,可以被派生类重写的函数可有默认实现✅(基类也可调用)多态调用(通常用于接口有默认行为)纯虚函数= 0基类中只声明,不提供实现的虚函数抽象接口❌(不能实例化基类)设计接口类,强制子类实现虚基类用于多重继承中避免“菱形继承”的重复基类问题避免数据成员冗余多重继承设计中的基类虚函数支持“多态行为”,纯虚函数用于“强制子类实现接口”,它们背后靠的是vtablevptr,让程序在运行时选择正确的函数实现。
2025-07-25 16:24:43
430
原创 动态链接和静态链接的区别?原理是什么?
静态链接把库代码“打包进程序”,运行时不依赖外部库;动态链接是“运行时加载外部库”,可节省空间、便于更新,但依赖环境完整性。
2025-07-24 19:26:43
549
原创 class占用的的内存大小怎么计算?
类型大小示例(64位)备注空类 / 空结构体1 字节必须可寻址仅 int 成员4 × 个数注意对齐int + char8 字节(含 padding)char后面可能补 3 字节指针成员每个 8 字节64 位平台有虚函数的类至少 8 字节(vptr)即使无其他成员多继承 / 虚继承更大多一个 vtable 或偏移表空基类优化(EBO)可能优化为 0 字节只适用于非虚继承。
2025-07-24 11:00:45
801
原创 Vector为了避免重复扩容做了那些机制?
机制说明📌 指数倍扩容策略O(1) 平均插入代价,减少 realloc 频率📌reserve(n)预分配用户手动避免扩容📌 不主动缩容保留已有 capacity,避免扩缩抖动📌 move 构造优化扩容减少元素复制成本(尤其是复杂类型)📌控制释放显式释放空间(需要谨慎使用)
2025-07-24 10:43:54
339
原创 resize和reserve的区别
函数作用描述resize(n)改变 vector 的“实际元素个数”,创建或销毁元素reserve(n)只改变“容量” capacity,不改元素个数 sizeresize(n)修改 vector 的大小,会创建或销毁元素。reserve(n)只预留容量,提高效率,不创建任何元素。
2025-07-24 10:39:40
322
原创 野指针和内存泄漏是什么?
野指针内存泄漏野指针 = 用了“坏掉”的指针;内存泄漏 = 忘了把申请的内存还回去。两者都能造成严重后果,C++ 程序员必须养成良好的内存管理习惯。
2025-07-23 20:13:49
310
原创 类的成员变量初始化顺序
项内容初始化顺序按成员变量在类中声明的顺序初始化列表不能改变顺序,只能写出初始化表达式编译器会警告你初始化顺序不一致建议写初始化列表时顺序与声明顺序保持一致,可读性更强。
2025-07-23 19:54:53
260
原创 只能在栈上创建对象
目的方法禁止堆上创建禁止对象复制拷贝构造 / 赋值操作= delete保留正常栈上使用能力构造函数/析构函数保持 public。
2025-07-23 16:46:18
138
原创 push_back` 与 `emplace_back` 的区别
public:std::cout << "构造Person: " << name_ << "\n";std::cout << "拷贝构造Person: " << name_ << "\n";std::cout << "移动构造Person: " << name_ << "\n";// 拷贝构造// 构造+移动构造// 直接构造// 移动构造输出结果构造Person: Alice拷贝构造Person: Alice。
2025-07-22 19:22:10
443
原创 C++引用折叠
引用折叠是理解C++现代模板编程的关键概念之一,特别是在处理万能引用和完美转发时。记住引用折叠的四个规则,可以帮助你更好地理解模板类型推导和引用行为。
2025-07-22 16:52:41
799
原创 C++的完美转发
使用万能引用T&&接收任意类型的参数保持值类别使用有条件地转发引用折叠规则是类型推导的基础与可变参数模板结合可以转发任意数量的参数应用场景包括工厂模式、包装器、回调函数等完美转发是现代 C++ 泛型编程的重要技术,它使得我们可以编写完全通用的函数模板,同时保持最佳的性能特性。
2025-07-19 00:52:25
311
原创 Pass: Attention的切分和消除计算图中layout_transform
本文提出了针对Transformer模型中Attention计算的结构优化方案。首先通过多头分割实现并行处理,将Q/K/V张量切分为4份。其次,将矩阵乘法转换为卷积操作,提高计算效率。同时实现了数值稳定的Softmax优化方案,通过最大值池化和卷积广播避免数值溢出。另外,还识别并消除了计算图中冗余的reshape、transpose和layout_transform操作,将6步操作简化为2步。这些优化显著减少了计算量,提高了模型运行效率,特别是在硬件加速场景下效果明显。实验结果表明,优化后模型在保持精度的同
2025-05-22 20:06:28
262
原创 Bert系列模型优化
本文介绍了两种深度学习计算图的优化方法:1)将特定条件的max操作转换为max_pool2d序列,针对BERT注意力机制后维度缩减优化,需满足输入为3D/4D且在最后一维执行max操作;2)卷积算子融合优化,将"conv2d->reshape->add"模式重排为"conv2d->add->reshape",要求add的常量为1D且与卷积输出最后一维相同,从而提升内存访问效率和数据局部性。两种优化均通过匹配特定计算图模式并重写实现性能提升。
2025-05-21 16:46:48
156
原创 如何切分卷积?
本文介绍了三种卷积计算的优化方法: 按高度切分:将大张量卷积按H维度分片处理,通过输入分片、并行计算和结果拼接,控制内存占用≤1.6MB,关键步骤包括切片计算、输入推导和边界处理。 按通道切分:将卷积核拆分后并行计算,避免大中间结果存储,通过权重拆分和结果重组优化性能。 分片后拼接:识别复杂计算模式后分片处理,调整padding策略,显著降低峰值内存并提升缓存利用率。这些方法通过分片计算和并行处理,有效优化了内存使用和计算效率。
2025-05-20 20:26:03
436
原创 ocr系列模型推理的优化
文章摘要:本文提出了一种优化卷积神经网络计算的方法,将concat后接conv2d的模式转换为并行卷积后相加的结构。通过数学证明,该转换保持了计算等价性。以PaddleOCR模型为例,展示了优化前后的Relay图对比:优化前为concat+conv2d+add+relu的串联结构;优化后拆分为4个并行卷积分支相加,再整合偏置和激活。该方法存在输入数量固定(需4个)和权重需均等拆分的限制。这种转换能提升计算效率,但需扩展以适应更灵活的输入配置。
2025-05-20 12:24:02
286
原创 C++中,四种类型转换运算符
转换类型 | 检查时机 | 安全性 | 主要用途 || 编译时 | 中等 | 相关类型转换 || 运行时 | 高 | 多态类型向下转换 || 无 | 极低 | 无关类型二进制重解释 |const_cast| 编译时 | 低 | 修改constvolatile。
2025-05-12 10:17:39
424
原创 C++ 中的二进制、八进制、十六进制
C++ 提供了多种进制表示和操作方式,方便开发者进行底层编程和调试。二进制、八进制和十六进制分别通过 0b、0 和 0x 前缀表示,并可通过 <iostream> 的格式化控制输出不同进制的数值。C++ 还支持位操作符(如 &、|、^ 等),用于处理二进制数据。十六进制常用于表示内存地址、颜色值和文件头标识。C++14 引入了二进制字面量,并支持分隔符以提高可读性。此外,C++ 提供了字符串与数字之间的进制转换功能,便于数据处理。调试时,开发者可以灵活切换进制输出,快速定位问题。
2025-05-11 01:05:57
560
原创 C++ 联合体终极指南
联合体(union)是一种特殊的数据结构,所有成员共享同一块内存空间。其核心特点包括:同一时间只能使用一个成员,大小由最大成员决定,修改一个成员会影响其他成员的值。联合体的基本语法简单,适用于类型转换、协议解析和节省内存等场景。C++11后支持匿名联合体和非平凡类型成员,但需手动管理构造和析构。联合体不能继承、包含虚函数或静态成员,且C++11前不能包含带构造函数的成员。相比于结构体,联合体共享内存,同一时间只能使用一个成员,常用于底层操作。实际应用中,联合体可用于模拟CPU寄存器、处理图形颜色等。使用时需
2025-05-11 00:49:10
373
原创 C++中的this指针
this指针是C++中一个非常重要的概念,它是一个指向当前对象的指针,在类的非静态成员函数中自动可用。下面我将详细解释this指针的用途和工作原理,并提供代码示例。
2025-05-08 11:23:27
407
原创 一文搞定C/C++ 技术面试基础知识总结
宏定义 #defineconst 常量宏定义,相当于字符替换常量声明预处理器处理编译器处理无类型安全检查有类型安全检查不分配内存要分配内存存储在代码段存储在数据段可通过#undef取消不可取消如何定义一个只能在堆上(栈上)生成对象的类?
2025-05-07 19:47:07
1923
原创 __init__文件的作用
作用说明标识包使目录成为可导入的Python包。初始化代码包被导入时自动执行中的代码。简化导入通过批量导入或定义__all__优化用户体验。兼容性确保包在旧版本Python中正常工作。如果没有特殊需求,可以是空文件,但合理利用它能大幅提升代码的可维护性和易用性。
2025-05-07 11:15:32
465
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人