C++ and mysql
文章平均质量分 81
C++ and mysql
喜欢打篮球的普通人
这个作者很懒,什么都没留下…
展开
-
【错误码】现代C++中的错误处理方案
cuda库的错误通过返回值返回,实际的值通过输入输出参数返回。optional可以直接定位到抛出的异常点,这是个进步。原创 2024-09-05 18:42:01 · 335 阅读 · 0 评论 -
【C++20】携程库基础知识
文章目录参考参考协程革命原创 2024-08-28 14:45:55 · 451 阅读 · 0 评论 -
【C++】inline关键字的作用是“内联优化”?
文章目录参考参考【C++辟谣】inline关键字的作用是“内联优化”?你可能是谭浩强的原创 2024-08-28 14:43:20 · 132 阅读 · 0 评论 -
【现代C++】如何写出易于维护的代码?类型就是最好的注释!
文章目录参考参考【现代C++】如何写出易于维护的代码?类型就是最好的注释!原创 2024-08-28 14:42:06 · 143 阅读 · 0 评论 -
【GCC】编译选项与告警(C/C++建议开启)
文章目录参考参考【GCC】C/C++初学者建议开启这些警告,编译期就排除大量危险隐原创 2024-08-28 14:40:27 · 197 阅读 · 0 评论 -
【C++11】自制unique_ptr容器
文章目录参考参考【C++11】自己动手实现unique_ptr智能指针,都有哪些难点?原创 2024-08-28 14:38:09 · 214 阅读 · 0 评论 -
【C++11】自制optional容器
文章目录参考参考【C++标准库】自己动手实现std::optional容器原创 2024-08-28 14:36:22 · 271 阅读 · 0 评论 -
【C++11】智能指针与对象生命周期
文章目录参考参考【C++11】智能指针与对象生命周期,常见问题答疑原创 2024-08-28 14:34:18 · 136 阅读 · 0 评论 -
【C++17】内存池与多态分配器
文章目录参考参考【C++17新特性】内存池与多态分配器(std::pmr::memory_resource)原创 2024-08-28 14:27:24 · 227 阅读 · 0 评论 -
【C++版本】protobuf与gRPC
Google Protocol Buffers(protobuf)是一种语言中立、平台中立的序列化协议,旨在高效地将结构化数据进行序列化和反序列化。(3)Protobuf 可以与 gRPC 结合使用,定义和实现高效的 RPC 协议,支持流式传输和双向通信。每个字段有一个唯一的编号,用于标识字段。required:表示字段是必需的,消息必须包含该字段,否则解析消息时会报错。optional:表示字段是可选的,消息中可以包含也可以不包含该字段。每个字段有三部分:修饰符、类型和字段名,以及一个唯一的编号。原创 2024-07-29 17:58:55 · 840 阅读 · 0 评论 -
【C++11】C++伪随机数生成器
Xorshift 随机数发生器xorshift游戏里经常使用uint32_t a;// 创建随机数引擎,使用 std::random_device 进行随机种子初始化// 定义均匀分布,生成0.0到1.0之间的浮点随机数// 生成并打印10个随机数i < 10;uint32_t a;uint32_t// 创建随机数引擎,使用 std::random_device 进行随机种子初始化。原创 2024-07-28 13:22:41 · 1182 阅读 · 0 评论 -
【C++20】从0开始自制协程库
很多人对协程的理解就是在用户态线程把CPU对线程的调度复制了一遍,减少了线程的数量,也就是说在一个线程内完成对协程的调度,不需要线程切换导致上下文切换的开销。但是线程切换是CPU行为,就算你的程序只有一个线程,多个应用一样会切换上下文,所以并不能提升效率。所以协程必须引入线程池以及epoll的多路复用才能在大部分情况下提升每个线程的运行效率,防止线程空转。原创 2024-07-24 09:44:36 · 695 阅读 · 0 评论 -
【c++11】什么情况下需要封装set/get
右值引用版本的build设计模式,如果涉及到管理资源的类,可以使用这个int handle;Cake() {}// 构造原味蛋糕handle = 0;// 构造巧克力蛋糕// 构造抹茶味蛋糕Cake c;return 0;int amount;int speed;int volume;Cake cake;Milk milk;return 0;原创 2024-07-16 10:13:26 · 923 阅读 · 0 评论 -
【c++11】多线程安全
在C++中,std::lock_guard 是一种用于管理互斥锁的RAII(Resource Acquisition Is Initialization)类。使用condition代替while循环中的unlock和lock操作。多线程队列类(mt_queue),线程之间统一用队列通信,无显式锁。原创 2024-07-15 10:04:42 · 961 阅读 · 0 评论 -
【c++11】cpp实现模板函数的声明与定义分离
在模板定义的cpp文件中声明其特化版本other.hoher.cppint(int);使用variant(C++17语法)代替上述的方式other.hother.cpp/*visit内部的实现方式可能就是通过index()选择的;or} , t);每个variant=32+8,string bytes+index bytes。每次占用内存过大,需要优化。所以使用data-oriented design进行改造。原创 2024-07-12 09:43:38 · 1515 阅读 · 0 评论 -
【C++】类型擦除 + 工厂模式,告别 if-else
需求点:假设一个第三方库有提供了很多Msg类,这些Msg类都提供了固定的一个成员函数,但是却没有虚基函数。如何在自己的项目代码中更好的使用这些Msg类内?原创 2024-07-06 17:22:35 · 486 阅读 · 0 评论 -
【C++11】自己封装RAII类,有哪些坑点?带你了解移动语义的真相
在C++中,std::move 对于智能指针(如 std::unique_ptr 和 std::shared_ptr)非常有用,因为智能指针管理动态分配的资源,如内存。在C++中,std::move 主要用于对象的移动语义,对于大多数内置类型(如整数),移动语义实际上没有意义。对于内置类型(如整数、浮点数等),移动与复制的成本是相同的,因为它们的大小是固定且已知的,且复制的成本非常低廉。在这种情况下,通过使用 std::move,可以避免昂贵的复制操作,提高性能。原创 2024-07-02 22:04:26 · 1099 阅读 · 0 评论 -
【C++11】深入剖析lambda仿函数的原理,自己动手实现std::function容器
文章目录参考参考【C++11】深入剖析lambda仿函数的原理,自己动手实现std::function容器实现自定义的Function原创 2024-06-18 13:04:19 · 357 阅读 · 0 评论 -
【C++11】区分左值、亡值、纯右值,及他们的引用
【C++11】区分左值、亡值、纯右值,及他们的引用cppdemangle.hprint.h原创 2024-06-14 11:04:36 · 262 阅读 · 0 评论 -
【C++20工程实战】自己动手实现纯头文件日志库
std::source_location 是 C++20 引入的一个标准库特性,用于获取代码的编译时信息,如文件名、行号、列号和函数名。这对于调试和日志记录非常有用,因为它可以在运行时捕获这些信息,而不需要手动提供。eg:假设我们有一组颜色定义,并希望使用这些定义来生成枚举和字符串数组。X-macro技术的基本思想是使用预处理器宏来定义一组数据或操作,然后通过另一个宏来实际展开这些数据或操作。std::source_location 提供了一种获取编译时源代码位置信息的便捷方法;原创 2024-06-05 10:19:45 · 793 阅读 · 0 评论 -
C++类型参数技术以及常见的类型擦除容器
这些类型擦除容器在需要存储和操作多态对象时非常有用,可以在运行时决定具体类型,而不需要在编译时知道类型的具体信息。根据具体需求和项目依赖,可以选择使用标准库或 Boost 库提供的类型擦除容器。原创 2024-05-30 11:07:55 · 453 阅读 · 0 评论 -
C++设计模式之单例模式、模板模式、状态模式、原型模式、CRTP 模式、组件模式、观察者模式、发布-订阅模式、访问者模式
文章目录参考参考游戏开发中经常用到的设计模式【C++】游戏开发常用的设计模式,高手都这样写?单例模式、组件模式、原型模式、访问者模式等原创 2024-05-26 17:27:43 · 577 阅读 · 0 评论 -
C++ vector,dequeu,list容器中元素的引用失效问题
这是因为std::list在内部使用节点来存储元素,每个节点都包含指向前后节点的指针,因此插入和删除操作只会影响相邻节点的指针,而不会影响其他节点。在这个示例中,即使在列表中插入和删除元素后,ref(原本指向第二个元素的引用)仍然有效,并且保持其值为2。原创 2024-05-26 14:19:44 · 497 阅读 · 0 评论 -
使用std::unique_ptr Pimpl造成的incomplete type的报错分析和解决
自定义删除器,将delete pImpl的操作,放到widget.cpp源文件中。// 预先声明class Impl;然后在源文件widget.cpp中delete p;这种方法改起来也不复杂,但是弊端也很明显,std::make_unique没法使用了,只能自己手动new,直接看源码吧这里返回的是默认删除器类型的unique_ptr,即std::unique_ptr。// 错误!原创 2024-02-25 17:11:00 · 992 阅读 · 0 评论 -
【C++20】编译期检测所有未定义行为undefined behavior和内存泄漏(不借助编译选项以及任何外部工具)
【C++20】编译期检测所有未定义行为和内存泄漏,不借助任何外部工具。原创 2024-01-06 09:57:54 · 1171 阅读 · 0 评论 -
使用dlopenC++动态库的函数符号的常规做法
在 C 中,符号名称与函数名称相同:strcpy 的符号将是 strcpy,因为在 C 中没有两个非静态函数可以具有相同的名称。因为 C++ 允许重载(具有相同名称但不同参数的不同函数)并且具有许多 C 所没有的功能(如类、成员函数、异常规范),所以不可能简单地使用函数名称作为符号名称。C++ 有一个特殊的关键字来声明具有 C 绑定的函数:extern “C”。声明为 extern “C” 的函数使用函数名称作为符号名称,就像 C 函数一样。因此,只有非成员函数可以声明为 extern “C”,并且不能重载原创 2023-11-18 16:31:30 · 654 阅读 · 0 评论 -
c++ inline namespace
C++11引入了inline namespace的语法,这个语法可以让程序员在不破坏现有代码的情况下添加新的命名空间。inline namespace的作用是将内层的命名空间成为外层的一个别名。也就是说,当程序员使用外层命名空间的时候,内层命名空间的内容也可以被访问到,不需要加上内层命名空间的限定符。这个特性可以帮助程序员更好地组织代码。举个例子,假设我们有一个命名空间foo,里面包含一个内层命名空间bar。// bar 中的内容// foo 中的内容。原创 2023-09-25 10:47:16 · 245 阅读 · 0 评论 -
C++正则表达式regex使用总结
正则表达式(regular expression)的C++库regex是一种强大的描述字符序列的工具 , C++11中也将正则表达式纳入了新标准的一部分。regex库中常用组件介绍在头文件中包含了多个我们使用正则表达式时需要用到的组件,即 #includeregex库组件详细介绍如下regex表示有一个正则表达式类,比如:regex pattern(“(.{3})(.{2})_(\d{4})!”)全文匹配,要求整个字符串符合正则表达式的匹配规则。原创 2023-09-23 17:31:19 · 2533 阅读 · 0 评论 -
C++中的类型擦除技术
在 main() 函数中,我们创建了两个不同类型的 Derived 对象 d1 和 d2,然后创建了一个 Functor 对象 f。通过调用 f(d1) 和 f(d2),我们将不同类型的对象传递给函数对象 f,它将根据对象的类型调用适当的 foo() 实现。process() 函数接受一个 std::function 类型的参数,它表示一个无返回值、不带参数的可调用对象。C++语境下的类型擦除,技术上来说,是编写一个类,它提供模板的构造函数和非虚函数接口提供功能;所以,这段代码可以过编译。原创 2023-08-17 17:23:11 · 1458 阅读 · 1 评论 -
C++变长模板参数、参数打包、tuple、index_sequence、逗号运算符、与折叠表达式
【代码】C++变长模板参数、参数打包、tuple、index_sequence、逗号运算符、与折叠表达式。原创 2023-08-03 22:46:32 · 581 阅读 · 0 评论 -
C++之type_traits与SFINAE用法
【代码】C++之type_traits与SFINAE用法。原创 2023-06-25 23:26:01 · 314 阅读 · 0 评论 -
使用auto对C++局部变量进行初始化
【代码】使用auto对C++局部变量进行初始化。原创 2023-06-08 07:41:02 · 285 阅读 · 0 评论 -
现代C++教程2023
模板参数:是一个模板类型。原创 2023-05-04 07:25:12 · 423 阅读 · 0 评论 -
C++类模板和函数模板声明和定义几种写法
};声明和实现分离,include了头文件之后不会把实现的代码也加入到该编译单元。然后需要将所有用到的类型都显式的实例化。. . . };原创 2023-02-01 23:32:41 · 383 阅读 · 0 评论 -
C++模板(第二版)笔记之第十二章:萃取的实现
解决办法3:对于那些不是总是生成整型值的值萃取, 使用 inline 成员函数。同样的, 如果成员函数返回的是字面值类型, 可以将该函数声明为 constexpr 的。问题:一个用户定义的任意精度的 BigInt 类型, 可能就不是字面值类型,原创 2023-01-11 23:55:39 · 630 阅读 · 0 评论 -
C++模板(第二版)笔记之第十八章:模板的多态性
动态多态:继承和虚函数实现;静态多态:模板也允许我们用单个统一符号将不同的特定行为关联起来, 不过该关联主要发生在编译期间;二、静态多态模板也可以被用来实现多态。 不同的是, 它们不依赖于对基类中公共行为的分解。 取而代之的是, 这一“共性( commonality) ” 隐式地要求不同的“形状( shapes) ” 必须支持使用了相同语法的操作。动态多态的eg改造成静态多态三、静态多态VS动态多态1.术语Static 和 dynamic 多态提供了对不同 C++编程术语的支持:动态多态:原创 2023-01-10 23:34:58 · 541 阅读 · 0 评论 -
C++模板(第二版)笔记之第十一章:泛型库
可以将函数, 函数指针, 函数对象, 仿函数和 lambdas 作为可调用对象(callables) 传递给模板。如果需要为一个 class 重载 operator(), 那么就将其声明为 const 的(除非该调用会修改它的状态)。通过使用 std::invoke(), 可以实现能够处理所有类型的、 可调用对象(包含成员函数)的代码。使用 decltype(auto)来完美转发返回值。类型萃取是可以检查类型的属性和功能的类型函数。原创 2023-01-03 23:37:59 · 511 阅读 · 0 评论 -
C++模板(第二版)笔记之第十章:模板基本术语
;唯一定义法则 one-definition rule,ODR) 常规(比如非模板) 非 inline 函数和成员函数, 以及非 inline 的全局变量和静态数据成员, 在整个程序中只能被定义一次。 Class 类型(包含 struct 和 union) , 模板(包含部分特例化, 但不能是全特例化) , 以及 inline 函数和变量, 在一个编译单元中只能被定义一次, 而且不同编译单元间的定义应该相同。编译单元是通过预处理源文件产生的一个文件;原创 2023-01-03 22:49:51 · 321 阅读 · 0 评论 -
C++模板(第二版)笔记之第九章:在实践中使用模板
这个文件的编译会花费一些时间, 但是如果内存足够的话, 预编译方案的编译速度几乎要比在不使用预编译方案时编译其它任何一个标准库头文件都要快。模板函数:和 inline 函数类似, 函数模板也可以被定义在多个编译单元中。为了实例化一个模板,编译器既需要知道需要实例化哪个函数, 也需要知道应该用哪些模板参数来进行实例化。当被定义在头文件中, 且不在类或者结构体中时, 函数模板的全特例化版本需要使用inline。不幸的是, 在上面这个例子中, 这两组信息都是被放在别的文件里单独进行编译的。原创 2023-01-02 23:07:29 · 548 阅读 · 0 评论 -
C++模板(第二版)笔记之第八章:编译期编程
IsPrime模板将结果存储在其成员 value 中。为了计算出模板参数是不是质数, 它实例化了DoIsPrime模板, 这个模板会被递归展开, 以计算 p 除以 p/2 和 2 之间的数之后是否会有余数。C++14则没有,但是要求各个计算步骤都能在编译期进行,此外堆内存分配和异常抛出都不被支持。C++模板的原始递归模板可以用来“计算一个程序的结果”由于 9%3 == 0, 因此它将返回 false;的定义通常都只能包含一个 return 语句。原创 2023-01-01 20:03:49 · 607 阅读 · 0 评论