
C++ and mysql
文章平均质量分 81
C++ and mysql
喜欢打篮球的普通人
这个作者很懒,什么都没留下…
展开
-
【C++】手搓variant
在 visit 函数中,std::common_type 确保 Lambda 适用于所有 Ts,并且它的返回类型是 所有返回值类型的公共类型。std::common_type<T1, T2, …>::type 计算出 所有 T1, T2, T3, …即,Lambda 作用于 T1 &, T2 &, T3 &, …封装个简单variant,为了防止类型是int,但是赋得的却是double类型的。它的作用是 推导出 Lambda 作用于所有 Ts 类型的返回值的公共类型。是 Variant 的所有可能类型。原创 2025-02-20 08:42:41 · 170 阅读 · 0 评论 -
【C/C++】printf后并不会立即显示?文件流的缓冲机制探究
模式触发输出的条件终端输出情况_IONBF(无缓冲)每次调用putchar()立即输出依次出现_IOLBF(行缓冲)遇到\n时刷新缓冲区Hello直到\n才一次性出现_IOFBF(全缓冲)缓冲区满了,或程序结束时才刷新可能什么都看不到,除非手动flush()原创 2025-02-20 08:41:03 · 245 阅读 · 0 评论 -
【C++20】编译期检测所有未定义行为和内存泄露
数组指针加法,超出了数组的范围也会报错,clang++会直接报错,gcc只在解引用的时候报错。std::end(a) 返回数组 a 尾后位置(即 &a[32],超出数组范围的一个位置)。使用 std::begin() 和 std::end() 初始化 std::vector。= std::end(a) 避免访问 a[32] 这个非法位置。std::begin(a) 返回数组 a 的首地址(即 &a[0])。结合 std::begin() 和 std::end()下面的会死循环,int越界是未定义行为。原创 2025-02-20 08:39:34 · 220 阅读 · 0 评论 -
【C++】实现一个JSON解析器
123。原创 2025-02-19 18:05:21 · 226 阅读 · 0 评论 -
【C++】静态反射实现自动JSON序列化
123。原创 2025-02-19 18:03:45 · 212 阅读 · 0 评论 -
【C++STL】自制标准库系列之map与set
123。原创 2025-02-19 17:41:08 · 176 阅读 · 0 评论 -
【现代C++】cpp 20自制携程库
123。原创 2025-02-19 17:37:26 · 201 阅读 · 0 评论 -
【错误码】现代C++中的错误处理方案
cuda库的错误通过返回值返回,实际的值通过输入输出参数返回。optional可以直接定位到抛出的异常点,这是个进步。原创 2024-09-05 18:42:01 · 625 阅读 · 0 评论 -
【C++20】携程库基础知识
文章目录参考参考协程革命原创 2024-08-28 14:45:55 · 615 阅读 · 0 评论 -
【C++】inline关键字的作用是“内联优化”?
要求在程序的一个翻译单元中,某个符号(变量、函数、类等)只能有一个定义。它是 C++ 中的链接规则之一,旨在确保程序中的符号在所有的翻译单元中只有唯一的定义,以避免链接错误。eg:不同的cpp文件对方的定义的全局成员和全局函数main.cppint i = 3;// 定义void foo();// 声明;//声明// 输出 3foo();// 调用 foo 函数foo();// 再次调用 foo 函数foo();// 第三次调用 foo 函数\n", i);// 输出 42。原创 2024-08-28 14:43:20 · 200 阅读 · 0 评论 -
【现代C++】如何写出易于维护的代码?类型就是最好的注释!
文章目录参考参考【现代C++】如何写出易于维护的代码?类型就是最好的注释!原创 2024-08-28 14:42:06 · 188 阅读 · 0 评论 -
【GCC】编译选项与告警(C/C++建议开启)
当使用 -Werror 时,所有警告都会被提升为错误,导致编译失败。当浮点数(如 float 或 double)被隐式转换为整数类型(如 int)时,小数部分会被直接截断,导致精度丢失。gcc开启优化有时候报错会更多,建议编译时开启优化,没有优化,下面不报错,开启优化,func就内联了会报错,变量没有初始化。-Wfloat-conversion 是 GCC 编译器中的一个警告选项,用于检测浮点数与整数之间的隐式转换问题。当整数类型被隐式转换为浮点数类型时,如果浮点数无法精确表示该整数值,则会引发精度损失。原创 2024-08-28 14:40:27 · 393 阅读 · 0 评论 -
【C++11】自制unique_ptr容器
析构函数默认是noexcept的,如果要开启except,则需要加上false。情况 3:如果 struct 有 const 或 引用 成员。情况 1:所有成员类型都有默认构造函数。情况 2:结构体的成员没有默认构造函数。原创 2024-08-28 14:38:09 · 343 阅读 · 0 评论 -
【C++11】自制optional容器
如果构造函数不用explicit,那么可以作为隐式构造函数,在构造对象的时候可以不用写出类型名来;加上explicit就说明要写出类的名字;eg:没有 explicit(允许隐式转换)eg:加上 explicit(禁止隐式转换)eg:explicit 关键字在构造函数重载时,可以用于防止意外匹配模板构造函数,避免编译器错误地选择模板版本C++ 中 union 的后期初始化由于 union 只能存储一个活动成员,C++ 需要显式地管理对象的生命周期,特别是当 union 里有非平凡(non-triv原创 2024-08-28 14:36:22 · 410 阅读 · 0 评论 -
【C++11】智能指针与对象生命周期
文章目录参考参考【C++11】智能指针与对象生命周期,常见问题答疑原创 2024-08-28 14:34:18 · 227 阅读 · 0 评论 -
【C++17】内存池与多态分配器
文章目录参考参考【C++17新特性】内存池与多态分配器(std::pmr::memory_resource)原创 2024-08-28 14:27:24 · 506 阅读 · 0 评论 -
【C++版本】protobuf与gRPC
Google Protocol Buffers(protobuf)是一种语言中立、平台中立的序列化协议,旨在高效地将结构化数据进行序列化和反序列化。(3)Protobuf 可以与 gRPC 结合使用,定义和实现高效的 RPC 协议,支持流式传输和双向通信。每个字段有一个唯一的编号,用于标识字段。required:表示字段是必需的,消息必须包含该字段,否则解析消息时会报错。optional:表示字段是可选的,消息中可以包含也可以不包含该字段。每个字段有三部分:修饰符、类型和字段名,以及一个唯一的编号。原创 2024-07-29 17:58:55 · 1284 阅读 · 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 · 1763 阅读 · 0 评论 -
【C++20】从0开始自制协程库
很多人对协程的理解就是在用户态线程把CPU对线程的调度复制了一遍,减少了线程的数量,也就是说在一个线程内完成对协程的调度,不需要线程切换导致上下文切换的开销。但是线程切换是CPU行为,就算你的程序只有一个线程,多个应用一样会切换上下文,所以并不能提升效率。所以协程必须引入线程池以及epoll的多路复用才能在大部分情况下提升每个线程的运行效率,防止线程空转。原创 2024-07-24 09:44:36 · 901 阅读 · 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 · 1131 阅读 · 0 评论 -
【c++11】多线程安全
在C++中,std::lock_guard 是一种用于管理互斥锁的RAII(Resource Acquisition Is Initialization)类。使用condition代替while循环中的unlock和lock操作。多线程队列类(mt_queue),线程之间统一用队列通信,无显式锁。原创 2024-07-15 10:04:42 · 1110 阅读 · 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 · 2213 阅读 · 0 评论 -
【C++】类型擦除 + 工厂模式,告别 if-else
需求点:假设一个第三方库有提供了很多Msg类,这些Msg类都提供了固定的一个成员函数,但是却没有虚基函数。如何在自己的项目代码中更好的使用这些Msg类内?原创 2024-07-06 17:22:35 · 594 阅读 · 0 评论 -
【C++11】自己封装RAII类,有哪些坑点?带你了解移动语义的真相
在C++中,std::move 对于智能指针(如 std::unique_ptr 和 std::shared_ptr)非常有用,因为智能指针管理动态分配的资源,如内存。在C++中,std::move 主要用于对象的移动语义,对于大多数内置类型(如整数),移动语义实际上没有意义。对于内置类型(如整数、浮点数等),移动与复制的成本是相同的,因为它们的大小是固定且已知的,且复制的成本非常低廉。在这种情况下,通过使用 std::move,可以避免昂贵的复制操作,提高性能。原创 2024-07-02 22:04:26 · 1209 阅读 · 0 评论 -
【C++11】深入剖析lambda仿函数的原理,自己动手实现std::function容器
文章目录参考参考【C++11】深入剖析lambda仿函数的原理,自己动手实现std::function容器实现自定义的Function原创 2024-06-18 13:04:19 · 430 阅读 · 0 评论 -
【C++11】区分左值、亡值、纯右值,及他们的引用
【C++11】区分左值、亡值、纯右值,及他们的引用cppdemangle.hprint.h原创 2024-06-14 11:04:36 · 297 阅读 · 0 评论 -
【C++20工程实战】自己动手实现纯头文件日志库
std::source_location 是 C++20 引入的一个标准库特性,用于获取代码的编译时信息,如文件名、行号、列号和函数名。这对于调试和日志记录非常有用,因为它可以在运行时捕获这些信息,而不需要手动提供。eg:假设我们有一组颜色定义,并希望使用这些定义来生成枚举和字符串数组。X-macro技术的基本思想是使用预处理器宏来定义一组数据或操作,然后通过另一个宏来实际展开这些数据或操作。std::source_location 提供了一种获取编译时源代码位置信息的便捷方法;原创 2024-06-05 10:19:45 · 926 阅读 · 0 评论 -
C++类型参数技术以及常见的类型擦除容器
这些类型擦除容器在需要存储和操作多态对象时非常有用,可以在运行时决定具体类型,而不需要在编译时知道类型的具体信息。根据具体需求和项目依赖,可以选择使用标准库或 Boost 库提供的类型擦除容器。原创 2024-05-30 11:07:55 · 579 阅读 · 0 评论 -
C++设计模式之单例模式、模板模式、状态模式、原型模式、CRTP 模式、组件模式、观察者模式、发布-订阅模式、访问者模式
文章目录参考参考游戏开发中经常用到的设计模式【C++】游戏开发常用的设计模式,高手都这样写?单例模式、组件模式、原型模式、访问者模式等原创 2024-05-26 17:27:43 · 702 阅读 · 0 评论 -
C++ vector,dequeu,list容器中元素的引用失效问题
这是因为std::list在内部使用节点来存储元素,每个节点都包含指向前后节点的指针,因此插入和删除操作只会影响相邻节点的指针,而不会影响其他节点。在这个示例中,即使在列表中插入和删除元素后,ref(原本指向第二个元素的引用)仍然有效,并且保持其值为2。原创 2024-05-26 14:19:44 · 574 阅读 · 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 · 1149 阅读 · 0 评论 -
【C++20】编译期检测所有未定义行为undefined behavior和内存泄漏(不借助编译选项以及任何外部工具)
【C++20】编译期检测所有未定义行为和内存泄漏,不借助任何外部工具。原创 2024-01-06 09:57:54 · 1598 阅读 · 0 评论 -
使用dlopenC++动态库的函数符号的常规做法
在 C 中,符号名称与函数名称相同:strcpy 的符号将是 strcpy,因为在 C 中没有两个非静态函数可以具有相同的名称。因为 C++ 允许重载(具有相同名称但不同参数的不同函数)并且具有许多 C 所没有的功能(如类、成员函数、异常规范),所以不可能简单地使用函数名称作为符号名称。C++ 有一个特殊的关键字来声明具有 C 绑定的函数:extern “C”。声明为 extern “C” 的函数使用函数名称作为符号名称,就像 C 函数一样。因此,只有非成员函数可以声明为 extern “C”,并且不能重载原创 2023-11-18 16:31:30 · 909 阅读 · 0 评论 -
c++ inline namespace
C++11引入了inline namespace的语法,这个语法可以让程序员在不破坏现有代码的情况下添加新的命名空间。inline namespace的作用是将内层的命名空间成为外层的一个别名。也就是说,当程序员使用外层命名空间的时候,内层命名空间的内容也可以被访问到,不需要加上内层命名空间的限定符。这个特性可以帮助程序员更好地组织代码。举个例子,假设我们有一个命名空间foo,里面包含一个内层命名空间bar。// bar 中的内容// foo 中的内容。原创 2023-09-25 10:47:16 · 321 阅读 · 0 评论 -
C++正则表达式regex使用总结
正则表达式(regular expression)的C++库regex是一种强大的描述字符序列的工具 , C++11中也将正则表达式纳入了新标准的一部分。regex库中常用组件介绍在头文件中包含了多个我们使用正则表达式时需要用到的组件,即 #includeregex库组件详细介绍如下regex表示有一个正则表达式类,比如:regex pattern(“(.{3})(.{2})_(\d{4})!”)全文匹配,要求整个字符串符合正则表达式的匹配规则。原创 2023-09-23 17:31:19 · 3503 阅读 · 0 评论 -
C++中的类型擦除技术
在 main() 函数中,我们创建了两个不同类型的 Derived 对象 d1 和 d2,然后创建了一个 Functor 对象 f。通过调用 f(d1) 和 f(d2),我们将不同类型的对象传递给函数对象 f,它将根据对象的类型调用适当的 foo() 实现。process() 函数接受一个 std::function 类型的参数,它表示一个无返回值、不带参数的可调用对象。C++语境下的类型擦除,技术上来说,是编写一个类,它提供模板的构造函数和非虚函数接口提供功能;所以,这段代码可以过编译。原创 2023-08-17 17:23:11 · 2003 阅读 · 1 评论 -
C++变长模板参数、参数打包、tuple、index_sequence、逗号运算符、与折叠表达式
【代码】C++变长模板参数、参数打包、tuple、index_sequence、逗号运算符、与折叠表达式。原创 2023-08-03 22:46:32 · 775 阅读 · 0 评论 -
C++之type_traits与SFINAE用法
【代码】C++之type_traits与SFINAE用法。原创 2023-06-25 23:26:01 · 412 阅读 · 0 评论 -
使用auto对C++局部变量进行初始化
【代码】使用auto对C++局部变量进行初始化。原创 2023-06-08 07:41:02 · 348 阅读 · 0 评论 -
现代C++教程2023
模板参数:是一个模板类型。原创 2023-05-04 07:25:12 · 478 阅读 · 0 评论