
C++基础
文章平均质量分 51
Funny-Boy
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
noexcept 优势
(这一点很关键,接口设计时候,不可忽视的一个细节)明确告诉编译器无需处理异常路径,直接省略异常处理代码,减少二进制体积并提升执行效率。编译器可假设noexcept 函数无异常分支,生成更直白的指令序列,提升流水线效率。框架等),即使函数未实际抛出异常。是函数接口的一部分,强制设计者明确异常行为,减少隐藏的运行时风险。,容器会优先使用移动(高效);)在扩容或移动元素时,会根据操作的。函数更易被内联,减少函数调用开销。:减少异常处理代码,提升运行效率。:影响标准库和编译器的决策(如移动。/拷贝选择、内联)。原创 2025-05-27 07:29:03 · 277 阅读 · 0 评论 -
第一章:类型推导,左值,右值
auto的使用必须马上初始化,否则无法推导出类型auto在一行定义多个变量时,各个变量的推导不能产生二义性,否则编译失败auto不能用作函数参数在类中auto不能用作非静态成员变量auto不能定义数组,可以定义指针auto无法推导出模板参数decltype推导规则对于decltype(exp)有exp是表达式,decltype(exp)和exp类型相同exp是函数调用,decltype(exp)和函数返回值类型相同。原创 2024-11-10 12:32:02 · 877 阅读 · 0 评论 -
菱形继承原理
普通菱形继承:基类冗余存储,存在数据冗余和二义性。虚继承:通过虚基类指针共享唯一基类,牺牲间接访问性能换取空间和语义统一。编译器通过虚基类表(如GCC的vbptr)管理偏移量,确保派生类正确访问共享基类。最后,尽量不使用菱形继承:● 组合代替继承:将共享功能封装为工具类,通过对象组合调用。● 接口分离:将基类拆分为多个职责单一的接口,避免多重继承。● 依赖注入:通过参数传递依赖对象,而非直接继承。原创 2025-05-18 12:52:51 · 580 阅读 · 0 评论 -
内联函数和宏的区别
除非需要宏特有的功能(如条件编译、代码生成)。(注:函数调用哪些开销?主要都是用来避免函数调用,提交性能。原创 2025-05-13 07:15:08 · 322 阅读 · 0 评论 -
类初始化方法
掌握类初始化的正确方法,能够有效避免资源泄漏、提升程序性能,并为复杂对象系统奠定可靠基础。实际开发中应结合具体需求,灵活选择最适合的初始化策略。原创 2025-05-13 07:00:47 · 400 阅读 · 0 评论 -
vector`的底层实现
在C++标准库中,vector。原创 2025-05-13 06:35:44 · 434 阅读 · 0 评论 -
std::move 和 std::forward
特性std::move目的强制转为右值,触发移动语义保持参数原始值类别,完美转发转换条件无条件依赖模板参数T典型应用移动构造函数、避免拷贝泛型代码中的参数转发参数类型接受任意类型通常与万能引用T&&配合使用。原创 2025-05-12 23:03:37 · 439 阅读 · 0 评论 -
C(Notes.1)
Note that if you want to initialize all elements of an array to a non-zero value(e.g.,1), you cannotuse the syntax in a[10]={1}; The statement int a[10]= {1}; will only initialize a[0] to 1,while allother elements will be initialize to 0(according to t原创 2024-12-12 07:35:06 · 159 阅读 · 0 评论 -
Memory Ordering
【代码】Memory Ordering。原创 2024-12-09 21:35:40 · 278 阅读 · 0 评论 -
左值和右值的概念以及std::move的使用
1、左值和右值的概念 左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体; 右值当在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。 一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址。2、引用引用是C++语法做的优化,引用的本质还是靠指针来实现的。引用相当于变量的别名。引用可以改变指针的指向,还可以改变指针所指向的值。引用的基本规则:声明引用的时候必须初始化,且一旦绑定,不可把引用绑定到其他对象;即引用转载 2021-07-15 11:31:57 · 321 阅读 · 0 评论 -
这篇文章把 TCP/IP 讲绝了!
这篇文章把 TCP/IP 讲绝了!原创 2021-07-15 09:35:04 · 132 阅读 · 0 评论 -
深入理解 CPU 的分支预测(Branch Prediction)模型
深入理解 CPU 的分支预测(Branch Prediction)模型使用表结构优化优化前代码// test_predict.cc#include <algorithm>#include <ctime>#include <iostream>int main() { const unsigned ARRAY_SIZE = 50000; int data[ARRAY_SIZE]; const unsigned DATA_STRIDE =原创 2021-07-06 10:07:16 · 364 阅读 · 0 评论 -
位操作技巧
位操作技巧原创 2021-07-06 09:52:29 · 137 阅读 · 0 评论 -
C++ stable_sort()用法详解
sort() 是不稳定排序,stable_sort是稳定排序#include <iostream> // std::cout#include <algorithm> // std::stable_sort#include <vector> // std::vector//以普通函数的方式实现自定义排序规则bool mycomp(int i, int j) { return (i < j);}//以函数对象的方式实现自.原创 2021-06-16 15:11:09 · 3013 阅读 · 0 评论 -
C++之 智能指针之make_unique与make_shared
尽量使用std::make_unique和std::make_shared而不直接使用new智能指针之make_unique与make_shared原创 2021-06-03 09:29:32 · 338 阅读 · 0 评论 -
十大经典排序算法(动图演示)
算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。算法复杂度相关概念稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。时间复杂度:对排序数据的总的操作次数。转载 2021-03-23 10:51:05 · 231 阅读 · 0 评论 -
运行时类型识别(RTTI)
运行时类型识别(RTTI)RTTI是什么?通过RTTI程序能够使用基类的指针或引用来检索这些指针或引用所指对象的实际派生类型通过两个操作符提供RTTI,typeid操作符,dynamic_case操作符。虚函数和dynamic_case选择当具有基类的引用或指针时,但需要执行不是基类组成部分的派生类操作时,需要动态的强制类型转换。通常,从基类指针获得派生类行为最好的方法是通过虚函数。当使用虚函数时候,编译器自动根据对象的实际类型选择正确的函数。但是,在某些情况下,不可能使用虚函数。在这些情况原创 2020-05-28 13:57:35 · 413 阅读 · 0 评论 -
容器与算法(顺序容器)
容器常见知识点一(顺序容器)顺序容器容器内元素的约束容器元素类型必须支持赋值运算元素类型的对象必须可以复制如果容器存储类类型的对象,那么只有当其元素类型提供默认构造函数时,容器才能使用这种构造函数。容器常用操作迭代器,list容器既不支持算术运算,也不支持关系运算在顺序容器中添加元素:push_front(t) 只适用于list和dequeinsert(iter,t) 返回指向新添加元素的迭代器在vector容器中添加元素可能会导致整个容器重新加载,这样的话,该容器涉及的所有迭代器原创 2020-05-28 09:56:38 · 247 阅读 · 0 评论