
C++11
Michael_Good
脚踏实地,不负时光!
展开
-
[GTEST] 笔记下使用过程遇到的事情
在写单测模块时,需要使用CPP进行编码。具体是为什么,还不太清楚。使用C进行写单测,会报错。原创 2025-03-04 19:44:22 · 128 阅读 · 0 评论 -
【C/C++】C++类实现了拷贝构造,但未实现移动构造,使用std::move传递数据,结果是什么?
如果类包含不能被移动的成员(比如那些只提供了拷贝构造函数而非移动构造函数的成员),即使你定义了移动构造函数,也无法对这些成员进行移动,只能选择拷贝它们。不会如预期那样进行移动,而是会调用相应的拷贝操作符。这是因为一旦你定义了任何一个拷贝控制成员,编译器就不会为你自动生成移动操作符。如果你的类定义了自己的拷贝构造函数、拷贝赋值操作符或析构函数,但没有定义移动构造函数或移动赋值操作符,那么使用。如果类没有定义任何拷贝控制成员(即拷贝构造函数、拷贝赋值操作符、析构函数),并且所有成员都可以被移动,则。原创 2025-01-16 14:49:24 · 187 阅读 · 0 评论 -
【C/C++】#pragma pack(1)与#pragma pack(push,1)的区别
二者区别不大,但是从变动方面来说,第一种方式需要改动编译器默认值,相对而言,第二种,稍好。二者都是,编译器设置参数的方法。原创 2025-01-16 14:07:37 · 394 阅读 · 0 评论 -
libpcap、Winpcap、Npcap三者关联与区别
Libpcap主要服务于类Unix系统,WinPcap将其功能扩展到了Windows环境,而Npcap则在此基础上进一步增强了功能、性能及安全性,成为目前Windows平台上推荐使用的库。原创 2025-01-10 13:29:49 · 567 阅读 · 0 评论 -
【C/C++】windows平台同步锁机制种类
CriticalSection:Mutex(互斥量):Semaphore(信号量):Slim Reader/Writer (SRW) Locks:Interlocked Functions:Condition Variables:Event Objects:原创 2025-01-09 13:44:45 · 482 阅读 · 0 评论 -
【C/C++】Protobuf与nlohmann/json的比较
特性Protobufnlohmann/json数据格式二进制格式,紧凑,不可读文本格式,可读性强性能序列化/反序列化速度快,内存占用小序列化/反序列化速度慢,内存占用大跨语言支持多语言支持,代码生成广泛的语言支持,无需代码生成学习曲线学习成本高,文档丰富学习成本低,API简洁易用扩展性和灵活性强类型系统,字段编号,向后兼容性好弱类型系统,动态性高,灵活性好生态系统成熟的生态系统,官方支持,gRPC等轻量级库,社区活跃,单头文件集成原创 2025-01-06 14:20:21 · 316 阅读 · 0 评论 -
【C/C++】C++新特性实践方向
C++ 新特性核心内容,主要关注点:原创 2025-01-06 11:04:29 · 185 阅读 · 0 评论 -
【C/C++】nlohmann::json从文件读取json,并进行解析打印,实例DEMO
使用 json::parse 函数将JSON格式的字符串解析为 nlohmann::json 对象。这个函数支持多种输入源,包括字符串、文件流等。原创 2025-01-03 12:01:36 · 384 阅读 · 0 评论 -
【C/C++】nlohmann::json的优劣
最近在使用作为数据结构辅助,进行分析了下nlohmann::json的优劣,以及适用的场景。原创 2025-01-03 11:59:00 · 1416 阅读 · 0 评论 -
【C/C++】C语言打印十六进制数据
2、使用PRIx64 和 PRIu64 宏(需要头文件 inttypes.h,支持跨平台)1、使用 "%llu"格式说明符。原创 2025-01-02 13:51:59 · 984 阅读 · 0 评论 -
【C/C++】大小端转换-大端转为小端
【代码】【C/C++】大小端转换-大端转为小端。原创 2024-12-30 11:33:56 · 262 阅读 · 0 评论 -
【C/C++】大小端转换
【代码】【C/C++】大小端转换。原创 2024-12-30 11:31:43 · 290 阅读 · 0 评论 -
【C/C++】VS2022生成DLL时,输出的导入库名称的修改方法
我们若是开发一个 xx.dll ,则一种对外符号方式是通过导入库的形式,即生成目录下会存在一个 xx.lib ,其他项目若是想使用 xx.dll ,则需要在其项目链接器中添加 xx.lib , 否则会出现符号找不到的情况。当然,大家也可以直接使用函数地址偏移。原创 2024-12-27 14:32:03 · 323 阅读 · 0 评论 -
【C/C++】C语言编程规范
● 使用表达式定义常量时,必须用括号括起来,避免在使用时由于操作符优先级导致的异常结果;同样,对于函数形式的宏,每个参数在函数体中都要用括号括起来。● 使用GOTO时,标签名需要有实际意义,例如说明后续代码的意图,说明走到该分支的原因等。● 对于#if、#ifdef、#elif等预处理指令,由于关键字后就是判断条件,不需要添加注释。● 如果函数形式的宏包含未使用的参数,请使用static inline函数,不要使用宏。● 如果函数中使用的临时变量超过10个,它的功能可能过于复杂了,需要考虑如何拆分。原创 2024-12-26 11:23:19 · 1021 阅读 · 0 评论 -
【C/C++】推荐一个性能优良的错误码打印机制,已实测!
但是,基于灵活可扩展思想,我们的错误码是与日俱增的,所以,如何能不写很多switch-case语句,是我们的一个思考点。基于上1篇 switch与for的性能比较文章,若我们在开发一个较大型的系统架构,则错误码机制是必不可少的。下面是在下拙见,抛砖引玉,希望可以给大家一些帮助。大家可以试着用一用!希望可以帮助到各位。原创 2024-12-23 14:06:52 · 370 阅读 · 0 评论 -
【C/C++】关于switch与for循环比对的性能优劣讨论
switch 语句:在处理有限且连续的整数状态时,switch 语句通常具有更好的性能,尤其是当编译器生成跳转表时。if-else 语句:在处理非连续或动态的状态时,if-else 语句可能是更好的选择,尤其是在状态数量较多且不固定的情况下。当 case 标签是连续的整数时,switch 的性能非常好,因为编译器可以生成跳转表,使得查找时间接近常数时间 O(1)。如果 for 循环内部包含复杂的逻辑(如大量的条件判断),可能会导致性能下降,尤其是在没有编译器优化的情况下。测试 switch 语句。原创 2024-12-23 11:55:15 · 623 阅读 · 0 评论 -
QtCreator中使用MSVC2017-x64编译器出现Error: lnk1257 代码生成失败
【代码】QtCreator中使用MSVC2017-x64编译器出现Error: lnk1257 代码生成失败。原创 2024-09-19 14:45:05 · 307 阅读 · 0 评论 -
【C/C++】对于 extern “C“ 的一些认识
最近,在开发底层的一些库,所以涉及到了底层API的设计与编码工作。有一些思考与总结,记录一下。原创 2024-09-11 15:55:07 · 277 阅读 · 0 评论 -
【异步IO】libevent&&libev&&libuv的相关认识
由于libevent和libev对Windows平台支持性较差(不支持完全端口iocp),所以,libuv出现了。最近在网络底层的开发,对于吞吐有一定要求,借机会,也了解了下业内常用的网络库。继承了libevent的优点,也改善了很多libevent中的问题。所以根据当前的业务是有在win平台的部分,所以选择了libuv。libuv是基于libev,,并在win平台上封装了iocp。在libev中对这些问题,进行了极大的改善。原创 2024-08-21 15:15:10 · 478 阅读 · 0 评论 -
【C/C++】C语言如何实现类似C++的智能指针?
需要注意的是,这仅是一个非常简单的实现,而且在C语言中实现动态内存管理与释放还需要程序员格外小心,以避免诸如内存泄漏和悬挂指针等问题。C语言的动态内存管理与C++中的智能指针相比较弱,更多地依赖程序员手动控制资源的生命周期。等,它们管理着所持有对象的生命周期,可以在智能指针被销毁时自动释放其所持有的资源。在C语言中,虽然没有直接的智能指针概念,但我们可以通过构造类似的功能来模拟智能指针的行为。在C语言中,我们可以创建一种类似智能指针的结构体,并为其提供一些基础的功能,比如自动释放分配的内存。原创 2024-06-04 00:38:11 · 1132 阅读 · 1 评论 -
【C/C++】C语言实现std::move
和完美转发是通过语言的高级特性来实现的,这些特性在C语言中并不存在。因此,C语言中的模拟方法需要更多的手动干预和错误检查。用于将一个对象转换为右值引用,以便可以使用移动语义。在C语言中,我们可以通过传递指针来模拟这种行为。请注意,这些模拟方法在C语言中并不完美,因为它们依赖于程序员手动管理资源和指针。结构体,它包含一个指向整数数组的指针。成员复制到目标数组,然后将源数组的成员设置为。函数来分配内存并初始化数组,以及一个。在这个例子中,我们定义了一个。,这样就模拟了所有权的转移。原创 2024-06-04 00:34:48 · 403 阅读 · 0 评论 -
【C/C++】C语言实现完美转发,亲测实例
在C++中,完美转发(Perfect Forwarding)和std::move是两个不同的概念,但它们都与资源的传递和管理有关。在C语言中,由于缺乏C++的模板和右值引用等特性,我们无法直接实现与C++中完全相同的完美转发和std::move。不过,我们可以模拟这些概念的一些行为。原创 2024-06-04 00:33:53 · 211 阅读 · 0 评论 -
【C/C++】C++完美转发解决了什么问题?
在模板函数中,我们可能需要根据参数是左值还是右值来执行不同的操作。它允许模板函数将参数原封不动地传递给另一个函数,同时保持参数的左值或右值属性。当模板函数需要将参数传递给另一个函数时,如果直接传递,可能会导致不必要的复制。例如,如果模板函数接收一个临时对象作为参数,那么这个临时对象会被复制到函数内部,然后在函数结束时再次被销毁。在C++中,完美转发解决了模板函数在传递参数时保持参数类型不变的问题。可以确保在转发参数时,如果参数是左值引用,它将被转发为左值引用;如果参数是右值引用,它将被转发为右值引用。原创 2024-06-04 00:31:02 · 392 阅读 · 0 评论 -
【C/C++】C++11 Lambda表达式捕获变量数量的影响
如果捕获的变量太多,lambda 表达式的执行速度可能会变慢,因为每个捕获的变量都需要在 lambda 表达式创建时进行复制或引用。引用捕获适用于需要在 Lambda 表达式中修改变量的值,或者需要访问变量的状态而不需要复制变量的情况。需要注意的是,如果在 Lambda 表达式中使用引用捕获变量,需要确保在 Lambda 表达式执行期间,被捕获的变量的生命周期不会结束。因此,在编写 lambda 表达式时,应该根据具体的需求选择合适的捕获变量的数量,以平衡程序的行为和性能。原创 2023-08-14 15:40:44 · 340 阅读 · 0 评论 -
【C/C++】C++11 Lambda 表达式捕获变量使用技巧
在 C++11 中,lambda 表达式可以通过捕获列表来捕获指定的变量。捕获列表是放在 lambda 表达式参数列表之前的一对方括号。表示以值的方式捕获变量。方括号中的变量名表示要捕获的变量,多个变量之间用逗号分隔。的值,并对它们进行了修改。在 lambda 表达式执行完毕后,我们再次输出变量。中,用来指定 lambda 表达式捕获哪些变量。在 lambda 表达式中,我们输出了变量。1.值方式捕获变量,该变量可读可写;2.引用方式捕获变量,该变量仅可读;表示以引用的方式捕获变量,的值没有改变,而变量。原创 2023-08-14 15:29:45 · 887 阅读 · 0 评论 -
【C/C++】C++11无序关联容器与有序关联容器的性能测评实验
C++11 提出了无序关联容器。关于新的容器进行实验测评,用以确认其适用场景。原创 2023-04-23 11:48:08 · 217 阅读 · 0 评论 -
【C/C++】C++11 无序关联容器的诞生背景
因此,在需要高效地进行元素的查找、插入和删除操作的场景下,应该使用无序关联容器。但是,由于哈希表的实现方式,无序关联容器的元素并不是按照它们被插入的顺序存储的,因此在需要有序存储元素的场景下,应该使用有序关联容器。由于无序关联容器的实现方式是基于哈希表的,它们使用哈希函数将元素的键映射到哈希表中的位置,因此可以快速地进行元素的查找、插入和删除操作,平均时间复杂度为 O(1)。因此,无序关联容器适用于需要高效地进行元素的查找、插入和删除操作的场景,而有序关联容器则适用于需要有序存储元素的场景。原创 2023-04-23 10:58:21 · 488 阅读 · 0 评论 -
【C/C++】C++11 无序关联容器 unordered_map 与 unordered_set 区别
但是,由于哈希表的实现方式,它们中的元素并不是按照它们被插入的顺序存储的,因此被称为“无序”。都是 C++ STL 中的无序关联容器,它们的主要区别在于存储的元素类型和存储方式。的例子:假设我们需要存储一些学生的信息,包括学生的姓名和年龄。的例子:假设我们需要存储一些整数,且这些整数必须是唯一的。存储的是键值对,每个元素都是一个键值对,其中键和值可以是任意类型。都是无序关联容器,它们的主要区别在于存储的元素类型和存储方式。存储的是唯一元素,每个元素都是一个值,且值必须是唯一的。原创 2023-04-23 10:14:17 · 886 阅读 · 0 评论 -
【C/C++】C++11 线程库重大历史意义
可以看到,使用C++11线程库的代码更加简洁和直观,而且不需要使用复杂的线程管理函数和数据结构。此外,C++11线程库还提供了一些新的语言特性,如lambda表达式和std::thread类等,使得程序员可以更方便地创建和管理线程。C++11 线程库实现原理: 封装库时使用了条件编译,即底层分别调用不同平台(Linux/Win/Mac)的线程API。C++11 线程库解决了历史多线程跨平台问题,增强可移植性。C++11 线程库特点:支持跨平台、支持面向对象封装的类。原创 2023-04-22 20:29:00 · 629 阅读 · 0 评论 -
【C/C++】C++11 智能指针循环引用问题以及解决方案
当需要访问 std::weak_ptr 所指向的对象时,需要先将其转换为 std::shared_ptr,如果转换成功,则说明对象仍然存在,可以安全地访问它。如果转换失败,则说明对象已经被销毁,不能再访问它。对象,并将它们互相引用,形成了一个循环引用。由于智能指针使用引用计数来管理内存,这意味着这两个对象的引用计数永远不会降为 0,它们的析构函数也永远不会被调用,从而导致内存泄漏。的引用就会失效,从而打破循环引用,释放内存。,这样它的引用计数就不会增加。在这个例子中,我们创建了两个。在这个例子中,我们将。原创 2023-04-21 17:11:30 · 960 阅读 · 0 评论 -
【C/C++】C++11 智能指针原理
每当有一个新的指针指向该对象时,其引用计数就会增加 1。当指向该对象的指针被销毁时,其引用计数就会减少 1。当对象的引用计数降为 0 时,说明该对象已经没有被引用的指针了,可以安全地释放其内存。当一个智能指针被创建时,它会自动分配一个对象,并将其引用计数初始化为 1。每当有一个新的智能指针指向该对象时,其引用计数就会增加 1。当对象的引用计数降为 0 时,智能指针会自动调用对象的析构函数,并释放其内存。智能指针是一种 C++ 中的语言特性,它可以自动管理动态分配的内存,避免内存泄漏和悬空指针等问题。原创 2023-04-21 16:55:01 · 160 阅读 · 0 评论 -
【C/C++】C++11 智能指针与普通指针重要区别
用于管理共享所有权的对象,即多个指针可以同时指向该对象,并且当所有指针都超出作用域时才会释放内存。这两种智能指针都提供了更加灵活和安全的内存管理方式,可以大大减少程序中的内存问题。总之,智能指针相比普通指针更加安全和方便,可以避免内存泄漏、悬空指针和竞态条件等问题。但是,智能指针也有一些缺点,例如可能会增加程序的开销和复杂度,需要谨慎使用。智能指针和普通指针都是 C++ 中用于管理动态内存的工具,但它们之间有一些重要的区别。用于管理独占所有权的对象,即同一时间只能有一个指针指向该对象;原创 2023-04-21 11:30:44 · 2015 阅读 · 0 评论 -
【C\C++】C++11 智能指针所有使用场景及实例代码
是共享所有权的智能指针,因此多个线程可以同时访问同一个对象,由智能指针来管理对象的生命周期,避免了多个线程同时访问或释放同一个对象的问题。如何证明 t2 夺取了 t1 的独占式智能指针的使用权),避免了多个线程同时访问同一个对象的问题。这些例子展示了智能指针的更复杂的用法,包括在多线程编程中共享资源、使用独占所有权和共享所有权的智能指针等。是共享所有权的智能指针,因此多个lambda表达式可以同时访问同一个对象,由智能指针来管理对象的生命周期,避免了多个lambda表达式同时访问或释放同一个对象的问题。原创 2023-04-21 10:56:00 · 1643 阅读 · 0 评论 -
【C++11】【函数式编程】C++11函数式编程特性
函数的前两个参数是输入序列的起始和终止迭代器,第三个参数是输出序列的起始迭代器,第四个参数是一个可调用对象,用于对输入序列中的每个元素进行操作。std::transform:std::transform是一个函数模板,可以对一个序列中的每个元素应用一个函数,并将结果存储到另一个序列中。std::bind:std::bind是一个函数适配器,可以将一个可调用对象和一些参数绑定在一起,生成一个新的可调用对象。是一个函数模板,可以对一个序列中的每个元素应用一个函数,并将结果存储到另一个序列中。原创 2023-04-17 21:27:23 · 907 阅读 · 0 评论 -
【C++11】【函数式编程】Lambda 表达式的前世今生
是一种编程范型,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。λ演算,即lambda calculus。原创 2023-04-17 19:29:49 · 734 阅读 · 0 评论 -
【RAII思想】C 实现 RAII 思想
在上面的例子中,定义了一个结构体Resource,包含一个int类型的指针data和两个函数指针init和release。init函数用于初始化资源,release函数用于释放资源。在main函数中,首先使用malloc函数动态分配了一个int类型的内存,然后调用init函数初始化资源。在main函数结束时,调用release函数释放资源。这个例子中,使用结构体封装了资源和相关的操作函数,实现了类似RAII的效果。在结构体的构造函数中获取资源,在结构体的析构函数中释放资源,确保资源的正确获取和释放。原创 2023-04-12 17:19:16 · 305 阅读 · 0 评论 -
【RAII 思想】RAII 基本概念(一种思想)
RAII(Resource Acquisition Is Initialization)是一种C++编程技术,它通过在对象的构造函数中获取资源,在对象的析构函数中释放资源,从而确保资源的正确获取和释放。RAII(Resource Acquisition Is Initialization)是一种C++编程技术,它通过在对象的构造函数中获取资源,在对象的析构函数中释放资源,从而确保资源的正确获取和释放。当使用RAII时,资源的获取和释放被封装在对象的构造函数和析构函数中,从而确保资源的正确获取和释放。原创 2023-04-12 17:18:36 · 6024 阅读 · 2 评论 -
【C++11】右值引用完美转发详解
保留参数的值类别:在函数调用时,如果使用传值方式传递参数,会导致参数的值类别被改变,例如将右值转换为左值。使用完美转发可以保留参数的值类别,将左值传递给接受左值引用类型的函数,将右值传递给接受右值引用类型的函数。避免对象移动:在函数调用时,如果使用传值方式传递参数,会导致参数对象的移动构造函数被调用,从而产生额外的开销。综上所述,完美转发可以提高代码的性能和效率,同时保留参数的值类别,支持通用代码的编写,是现代 C++ 编程中不可或缺的一部分。函数将参数以原样转发给函数对象,同时保留参数的值类别。原创 2023-04-12 08:52:49 · 913 阅读 · 0 评论 -
【C++11】新特性 - 右值引用详解
移动语义的本质是将一个对象的资源所有权从一个对象转移到另一个对象,避免不必要的复制和销毁操作,提高程序的性能和效率。对于右值对象,由于其不再被使用,因此可以将其资源所有权转移到另一个对象,避免了不必要的拷贝和销毁操作。而对于左值对象,由于其可能还会被使用,因此不能将其资源所有权转移到另一个对象,否则会导致程序出错。例如,如果将一个左值对象的资源所有权转移到另一个对象,那么原对象就不能再被使用,这可能会导致程序出现未定义行为。当一个对象是左值时,它通常是一个具有名称的变量或对象,它在程序中可能还会被使用。原创 2023-04-11 20:33:04 · 1054 阅读 · 0 评论 -
【C++11】右值引用深度详解
完美转发:右值引用可以用于实现完美转发,将一个函数的参数转发给另一个函数,保持参数的原始类型和值,避免不必要的类型转换和拷贝操作,提高程序的灵活性和可维护性。移动语义:右值引用可以用于实现移动语义,将一个对象的资源所有权从一个对象转移到另一个对象,避免不必要的复制和销毁操作,提高程序的性能和效率。可变性:右值引用可以用于实现可变性,允许修改右值对象的状态,避免了对临时对象的拷贝和销毁操作,提高程序的效率和可读性。右值引用的原理是通过将右值引用绑定到一个右值上,实现对右值的移动语义和完美转发等功能。原创 2023-04-11 19:20:05 · 1027 阅读 · 0 评论