
c++ 编程
文章平均质量分 80
c++ 编程
hjjdebug
西方用26个字母表示世界,计算机用0,1两个数字表示世界,大道至简!
人类用6号元素碳来思考, 计算机用14号元素硅来演算,精妙绝伦!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
模板元编程基础
摘要:本文介绍了C++模板元编程的基础概念,重点区分了编译期代码与运行期代码。主要内容包括:(1)constexpr关键字用于编译期计算;(2)模板元编程的特点和构成(元数据与元函数);(3)对比模板元编程和constexpr函数的实现方式,指出后者更简洁;(4)通过阶乘示例展示两种实现差异;(5)推荐使用在线工具查看模板展开过程。文章强调现代C++更倾向用constexpr函数进行编译期计算,而模板元编程更适合类型推导等场景。原创 2025-06-12 16:27:12 · 404 阅读 · 0 评论 -
std::ratio 简单使用举例
1. 先看一个简单的例子 1/2+/1/3=5/62 std::ratio 的手册页3. std::ratio_add 到底是什么呢?4. 代码注释5. 加深理解.原创 2025-06-09 15:04:43 · 1038 阅读 · 0 评论 -
std::allocator 系列问答
本文介绍了C++标准库中的std::allocator类模板,它是一种面向对象的内存管理工具,用于分配、释放内存以及构造和析构对象。文章通过问答形式阐述了std::allocator的作用、必要性及其优势。与直接使用new/delete相比,std::allocator遵循迪米特法则,将底层内存操作封装成类方法,使其他函数无需直接调用内存分配函数。文中还提供了一个使用std::allocator的完整示例代码,展示了如何分配内存、构造对象、使用对象、析构对象及释放内存的过程。最后通过反汇编分析了std::a原创 2025-06-04 15:50:48 · 766 阅读 · 0 评论 -
c++返回对象,返回引用,返回指针有什么区别?
返回对象, 优化了赋值构造,直接传递了this指针. 在函数内部有外部对象向this对象copy的过程.返回引用. 在函数内部没有copy的过程, 但在调用处,有赋值构造的过程.返回指针. 就是返回一个地址, 对象的使用由指针访问.返回对象,或返回引用都是返回一个地址, 返回对象返回的是目标地址,返回引用返回的是源地址,它们都伴随有源对象向目标对象的数据copy,只是发生的时机不同.而指针没有目标之说,它指的就是源对象的地址.原创 2025-06-04 11:33:09 · 565 阅读 · 0 评论 -
std::nullopt 深度解析.
1. std::nullopt 是什么?1.1 nullopt 的定义1.2 struct nullopt_t 的定义1.3 测试代码:2. nullopt 的使用,2.1 测试代码:2.2 分析: obj=std::nullopt2.3 std::nullopt 是什么?原创 2025-05-30 10:20:37 · 934 阅读 · 0 评论 -
c++11 tuple概念和使用
uple 的使用就是直接声明一个对象. 对象的类型由模板参数来确定,对象值由初始化列表来赋值.使用上的简单对应着实现上的复杂.这个对象,背后有一个隐含的,专有的tuple结构来支持. 似乎这个结构专为生成这一个对象而定义.由于这个结构中没有定义成员变量,无法通过名称来访问, 但你可以通过索引来访问.原创 2025-05-29 13:11:30 · 795 阅读 · 0 评论 -
c++结构化绑定
目的: 结构化绑定是C++17引入的特性,用于简化聚合类型的数据解构操作,操作对象:结构化绑定允许开发者通过单个声明(一行代码)将复合数据对象 (如std::tuple、数组、结构体)的成员直接解构至独立的变量.实现原理: 其本质是编译器自动生成对聚合类型成员的匿名引用或拷贝原创 2025-05-28 16:09:53 · 278 阅读 · 0 评论 -
c/c++类型别名定义
1. #define 是宏替换.2. c风格的typedef 通用形式 typedef type_orig alias3. c++风格的using 为类型定义别名的一般格式: using alias = type_orig4. using 的优点: 可以直接使用模板类型,5.测试代码, 顺便测试一下引用折叠.原创 2025-05-28 13:08:44 · 429 阅读 · 0 评论 -
int &&c =5; 代码解释
1. c 的类型是右值引用.2. c 的值类型是左值引用3. 为什么会有这样的设计?4. 总结:5. 测试代码:原创 2025-05-27 16:01:15 · 546 阅读 · 0 评论 -
c++数据类型和函数参数传递的基本概念
1.数据类型基本概念1.1 什么是左值,右值1.2 什么是左值引用,右值引用1.3 为什么要区分左值引用和右值引用?1.4 左值引用和右值引用在函数调用中是如何传递的?2. delctype 与 typeid 的使用2.1 decltype:2.2 decltype 返回的类型可以打印吗?3. c++怎样打印传递来的参数是左值类型还是右值类型?3.1 std::is_lvalue_reference,判别是否是左值引用3.2 实例代码原创 2025-05-27 11:51:24 · 1030 阅读 · 0 评论 -
c/c++怎样编写可变参数函数.
可见c++编译器,很好的解决了变参函数问题, 比c好多了.你可以通过sizeof…(args)得到编译器返给你的参数个数,是个常数.你可以通过折叠表达式描述你的代码.通过…来展开操作.原创 2025-05-25 16:28:25 · 788 阅读 · 0 评论 -
new,operator new,malloc 关系.
1. new 是什么?2. operator new 是什么?3. malloc 是什么?4. 完整测试代码:5. new operator new,malloc 关系图原创 2025-05-23 09:50:20 · 1080 阅读 · 0 评论 -
std::initialzer_list 与花括号{}数据列表
1.{数值列表}是什么?1.1 数组初始化 时 , 称为数组初始化列表1.2. 当用于容器时, 称为容器初始化列表1.3. 对于结构体或类,{1,2,3,4,5} 可用于初始化成员变量2. std::initializer_list 是什么?3. 实现自己的initializer_list3.1 可变参数包3.2 实现自己的initializer4.std::intializer_list 使用举例5. 小结原创 2025-05-22 16:23:10 · 1166 阅读 · 0 评论 -
chrono类 根据duration 类的周期类型得到对应的周期名称
熟悉 chrono 定时类的用法,熟悉模板函数的写法.熟悉运行函数及编译函数的混合用法原创 2025-05-21 16:25:20 · 636 阅读 · 0 评论 -
remove_const的工作原理及c++的类型推导
std::remove_const_t typedef为 std::remove_const::type而模板类中又typedef int std::remove_const::type, 所以说std::remove_const::type 等价于int, 是int的小名,由typedef 定义的.实际推导的过程是用模板类匹配类型参数, 把类型参数重新typedef一下.is_same_v(T,U)的判断更加简单, 也是根据模板类型匹配, T,U为同一类型,返回true原创 2025-05-21 13:54:16 · 1239 阅读 · 0 评论 -
std::chrono类的简单使用实例及分析
std::chrono类的简单使用实例及分析auto t1 = std::chrono::high_resolution_clock::now(); //t1 是time_point 对象auto delta_t = t2 - t1; //2个time_point 对象相减,肯定被重构了. 返回的是 duration 对象auto dur_obj = std::chrono::duration<double, std::milli>(delta_t); //构造以ms为单位的duration对象原创 2025-05-20 15:02:35 · 960 阅读 · 0 评论 -
c++虚函数与类型信息
0. 测试代码:1.无虚函数的类导出符号表2.有虚函数的类导出符号表3. vtable表中储存了什么? typeinfo表中储存了什么?4. 进一步研究type_info,5. typeinfo 的意义5.1 运行时类型信息(RTTI: runtime type info)原创 2025-05-19 15:08:21 · 690 阅读 · 0 评论 -
c/c++数据类型转换.
1. 为什么需要类型转换? 1.1 发生的时机: 1.2 常见的发生转换的类型: 2. c语言的类型转换: (Type) value 2.1 c语言的类型变换是如何实现的? 规则是什么? 3. c++ 的static_cast 4. c++的reinterpret_cast 5. dynymic_cast 的使用. 5.1: 测试代码 5.2 statci_cast 处理父子类对象地址原创 2025-05-18 22:32:07 · 1012 阅读 · 0 评论 -
c++函数调用运算符及类型转换运算符重载
0. 前言. 运算符包括以下运算符. 1. 运算符重载语句一般格式: 2. 函数调用运算符: 3. 类型转换运算符: 例如 int(); double(); bool(); 4. 测试代码原创 2025-05-17 15:08:46 · 566 阅读 · 0 评论 -
类模板的简单实例
1.实例代码:2. 模板类写法2.1 模板类的构造函数.2.2 模板类中的语句3. 模板类的实例化过程.3.1 实例化的进一步试验.4. 怎样调试constexpr 修饰的函数?原创 2025-05-16 15:37:13 · 1094 阅读 · 0 评论 -
C++ Lambda 表达式介绍
lambda 表示式并不是什么神秘的东西, 它是一种替代传统的定义函数,调用函数二步走,改变为定义lambda表达式和调用它一步走(代码都在一起)的简易处理手段.其内部实现方式是定义了一个匿名类并重载了operator()函数,使得对象能像函数一样调用.原创 2025-05-16 09:31:27 · 864 阅读 · 0 评论 -
constexpr 关键字的意义(入门)
1. constexpr 修饰的变量, 在编译期间就可以得到其数值.2. constexpr 修饰的函数, 可以在编译期间被调用.3. 研究代码4. constexpr 修饰的变量, 可以调用constexpr 修饰的函数来赋值5. constexpr 修饰的函数怎样调试呢?6. constexpr 修饰的函数, 在release版本下是怎样工作的?7. constexpr 还可以修饰构造函数,成员函数.7.1 在常量表达式函数中你不能调用printf 函数7.2 在运行函数中调用原创 2025-05-15 16:15:34 · 721 阅读 · 0 评论 -
std::ratio<1,1000> 是什么意思?
1. 它是一种数值吗?2. 它是一种类型吗?3. std:ratio 是什么呢?4. 分析一个展开后的模板函数5.小结:原创 2025-05-14 10:18:43 · 1175 阅读 · 0 评论 -
int &, int &&是什么意思? std::move(v)是怎样工作的?
1. 问: int &, int &&是什么意思?2. 问: 什么是左值,什么是右值?3. 左值变量只能绑定左值,右值变量只能绑定右值,常量左值变量可以绑定右值4. 测试代码如下:5. 高级分析15.1 分析赋值语句和左值引用汇编代码5.2 分析常量左值引用5.3 分析右值引用5.4 对引用的调用6. 高级分析2 std::move(v1) 是怎样工作的?6.1 std::vector<int>&& v2 的赋值6.2 std::vector<int> v4 的赋值原创 2025-05-12 16:21:45 · 582 阅读 · 0 评论 -
详解 c++17 重载类 overload的每一条语句,附实例.
1. template 模板类.2. class... Ts 是什么意思?3. template<class... Ts> 是什么意思?4. overload 是什么?5. Ts... 是什么?6. 小结7. using Ts::operator()... 是什么意思?8. overload(Ts...)-> overload<Ts...>9 附上我的研究代码.10. 这个重载类有什么用呢?原创 2025-05-09 16:39:57 · 534 阅读 · 0 评论 -
c++中默认参数值是怎样实现的?
1.什么是函数参数的默认值.2. 限制:3. C++默认参数是怎样实现的?原创 2025-05-07 17:56:16 · 227 阅读 · 0 评论 -
std::optional 类是个啥?
1. std::optional 是一个类. 而且还是一个模板类.2. std::optional 封装了什么?3. 封装这个数据干什么?4. 就干这点事还用得着设计一个类吗?5.一个简单的实例原创 2025-04-29 17:42:55 · 328 阅读 · 0 评论 -
std::functional 类是干什么用的?
1.functional 对象的概念2.functional 对象存在的意义2.1 为什么要把接口再封一层?2.2 c++中函数参数可以不用回调函数, 而改用functional 对象,统一接口3 补充: std::bind 的作用是什么?原创 2025-04-29 16:06:45 · 527 阅读 · 0 评论 -
c++中的enum变量 和 constexpr说明符
1.Q:enum 类型变量可以有++,--操作吗?1.1补充: c/c++中enum的另一个细微差别.2.Q: constexpr 修饰的函数,要求传入的参数必需是常量吗?3. Q constexpr 编译期求值真正的意思是什么?3.1 debug 版本, constexpr 修饰无效3.2 release 版本, constexpr 函数被优化掉了4. constexpr 中碰到了一个左值引用绑定问题5 x86-64 linux系统上函数调用传参约定原创 2025-04-23 13:58:45 · 921 阅读 · 0 评论 -
类的成员变量在头文件中初始化和在构造函数中初始化是怎样进行的?
结论: 头文件中的初始化会在构造函数中先执行, 构造函数中其是可以不用初始化了. 这两个地方有一处初始化就够了.原创 2025-01-17 13:30:18 · 420 阅读 · 0 评论 -
对象作为函数参数及对象作为返回值的工作过程
问: 类对象做为函数参数是怎样工作的?答: 对象作为函数参数是值copy, 会在栈上构建对象.然后调用子函数,函数操作的是栈上的临时对象.问: 类对象做为函数返回值是怎样工作的?答: 必不可少的会有一次赋值构造(=), 很可能还跟着2次copy构造, 一次是函数return了对象,return到何方? return 到赋值构造的源(=号的右值). 另一次是赋值构造(=)也会return对象,对象的目标肯定是return到=号的左值,原创 2024-09-10 11:07:07 · 412 阅读 · 0 评论 -
用vector 来排序字符串指针或结构指针
//采用自定义排序算法,才能灵活控制排序,//对结构数组指针排序,必需写自定义算法,花销会很小,因为排序挪动的数据只是个指针.//必需要加自定义排序算法comp, 否则就是对 char *本身的排序,达不到你的目的原创 2024-07-18 16:33:16 · 492 阅读 · 0 评论 -
带semaphore的buffer 应用实例
这是一个项目的缩减版.该项目内容是以一个恒定的码率去发送文件. 项目运行的很好,但是当在文件所在磁盘大量长时间 copy 文件时, 由于有大量磁盘读写操作,干扰了以恒定码率发送文件. 出现码率抖动. 意味着画面可能会卡顿.所以需要在外边包上一个外壳, 让外面的这个线程专门去抢磁盘资源, 放入缓存.则内层可以以恒定码率读取缓存,完成发送.这里对缓存的管理就引入了一个重要概念.gSemBufObj 对象. 带semaphore的缓存的管理对象.经实验效果不错. 分享这个模型代码以飨读者.原创 2024-03-18 10:25:35 · 778 阅读 · 0 评论 -
线程的通俗解释
1. 什么是线程? 2. 线程函数长得什么样? 3. 为什么要使用线程.4. 线程控制. 4.0 线程的执行和挂起 4.1: 线程中的互斥操作 4.2: 线程中的同步操作 4.3: 为什么不用全局变量作线程间控制变量? 4.4: 全局变量在线程同步或互斥中没有立足只地吗? 4.5: 线程的创建与销毁原创 2024-03-17 17:33:27 · 704 阅读 · 0 评论 -
将map 按值排序输出
手工构建一个简单的mapmap 不能直接排序,需要导出到vector,再按值排序即可.原创 2024-02-26 09:59:25 · 236 阅读 · 0 评论 -
c/c++ header_only 头文件实现的关键点
1. 对外声明的函数必需加上inline, 消除连接的歧义2. 在inline 函数内部声明的static 对象, 在多个文件包含时,对象是唯一的原创 2023-11-28 17:06:37 · 1828 阅读 · 0 评论 -
【 c++ 二元运算符重载,以<<(抽取符)为例,说清为什么它支持hex,endl等操作函数】
// c++2元运算符原创 2023-09-24 16:59:59 · 162 阅读 · 0 评论 -
c++实现的一个定时器实例
小结: 所谓的定时器, 当时间到时执行某一个任务,是通过启动一个线程来实现的,等待时是timer线程在等待,执行时是timer线程在执行.调用线程和执行线程是不同的线程原创 2023-09-23 12:05:47 · 504 阅读 · 0 评论 -
C++11 Lambda函数 入门
小结: lambda 函数存在的意义: lambda 函数可以直接访问父作用域变量(以值方式传递或以引用方式传递) [=]以值传递的方式捕获父作用域变量, 父作用域变量是不能直接修改的 加mutable 修饰符,就可以在函数体里修改, 但退出后值不变 [&]以引用方式捕获父作用域变量,就可以直接修改父作用域变量 于是乎, 当你在写一个函数时,如果你愿意,就可以随便再定义一个lambda函数, 它可以操控该函数的变量. 使得书写函数更灵活了!原创 2023-09-22 19:50:36 · 170 阅读 · 0 评论 -
说清楚 std::cout<<std::hex<<std::endl 到底是什么意思
在 "/usr/include/c++/9/bits/ios_base.h" 872行, 定义了hex 为一个函数,其参数是ios_base。# 在 "/usr/include/c++/9/iostream" 第107行, 定义了 ostream操作符原创 2023-07-12 17:34:25 · 841 阅读 · 1 评论