
C
文章平均质量分 89
pumpkin84514
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Protocol Buffers 全流程通俗讲解
配合反射可自动做日志脱敏。字段编号= 合同条款号,定下来就别改。类型定义= 条款内容,变动必须所有微服务一起升级。protoc= 自动翻译官,让 C++/Java/Python 都读同一本合同。原创 2025-05-14 23:01:40 · 795 阅读 · 0 评论 -
一文吃透 C++ 里的各种“匹配”
概念生活类比代码里典型场景查找 (find)通讯录里翻号码——只看“是不是同一个名字”匹配 (match)找“姓王、手机号以 188 开头”的人find_if、正则、Trie …一句话记忆查找 = 精确相等。匹配 = 满足条件,条件可以很花哨。int level;// 日志级别// 匹配条件:级别是偶数且包含 "ERROR"for (const auto& l : logs) { // 范围 for:从头到尾。原创 2025-04-23 22:44:52 · 1051 阅读 · 0 评论 -
C++ 容器查找效率
先写代码,测一次性能——复杂度只给方向,真快还是得跑数据。祝你写得顺、跑得飞!原创 2025-04-23 22:35:48 · 643 阅读 · 0 评论 -
使用成员函数指针数组简化C++类中的操作
在C++中,成员函数指针是指向类成员函数的指针。它允许我们在运行时动态地选择和调用类的成员函数。与普通函数指针不同的是,成员函数指针还需要知道要操作的对象实例。首先,我们需要定义一个成员函数指针类型,这个类型将用于声明我们的成员函数指针数组。这里Robot是我们的类名,而表示这是一个指向Robot类成员函数的指针,且该成员函数没有参数且返回类型为void。通过使用成员函数指针数组,我们可以有效地管理和调用一组相似的操作。这种方法不仅简化了代码结构,还增加了代码的灵活性和可扩展性。原创 2025-04-07 23:45:39 · 197 阅读 · 0 评论 -
C++中.h文件中的实现方法
在C++中,.h文件和Java中的接口有一些相似之处,但它们的作用和用法还是有很大区别。具体来说,.h文件通常用于声明,但也可以包含一些实现,特别是在某些特殊情况下。原创 2025-01-19 21:14:50 · 934 阅读 · 0 评论 -
C++字符串判空
对于empty()是最优的判断方式,时间复杂度为O(1),并且语义清晰。对于C风格字符串,检查指针是否为空或者检查第一个字符是否为'\0'都是O(1)的高效方法。使用==""进行比较的方法不推荐,尤其是对于较长的字符串,因为它的性能较差。原创 2025-01-19 17:51:33 · 1333 阅读 · 0 评论 -
vscode如何能像idea一样提交代码
在VS Code中,你可以通过以下方式像使用源代码管理面板来查看文件变更、暂存和提交代码。配合命令面板进行推送、拉取、切换分支等操作。使用GitLens和Git Graph插件来增强 Git 的功能,提供更多的历史查看和分支管理工具。原创 2025-01-13 03:04:59 · 1847 阅读 · 0 评论 -
安装 GCC 等工具的常见方法
使用包管理器:最简便的安装方法,适用于大多数用户,直接通过系统的包管理器安装 GCC 和相关工具。从源码编译安装:适用于需要特定版本或定制安装的用户。可以通过--prefix参数来指定安装路径,从而不影响全局环境变量。环境变量设置:通过临时设置、为特定用户设置或系统级别设置来调整环境变量,确保只对特定的安装版本生效,而不干扰系统默认版本。。原创 2025-01-12 02:26:54 · 899 阅读 · 0 评论 -
C++ 各标准的新特性
C++标准新特性C++11自动类型推断、右值引用、constexpr、范围-based for 循环、Lambda 表达式C++14、Lambda 泛型支持C++17、结构化绑定声明、C++20| 模块、概念、协程、每个新标准引入的新特性都增强了 C++ 的表达能力和编程效率,通过这些新特性,可以更加高效、安全和简洁地编写 C++ 代码。原创 2025-01-10 23:30:18 · 979 阅读 · 0 评论 -
C++的标准和C++的编译版本
C++标准定义了 C++ 编程语言的规则和功能,不同版本的标准提供了不同的特性和功能。例如,C++11、C++14、C++17、C++20 分别代表了不同的语言和库特性。编译器版本负责将 C++ 源代码转换为可执行代码。每个编译器版本都支持不同的 C++ 标准,较新的编译器支持较新的标准,并在性能、错误修复和新特性方面有更多改进。二者的关系:编译器版本决定了支持的 C++ 标准,而编译选项(如-std=c++xx)允许你选择使用哪个 C++ 标准。原创 2025-01-10 23:27:40 · 1256 阅读 · 0 评论 -
Windows上使用VSCode开发linux C++程序
插件适用于需要通过SSH连接到Linux远程机器进行开发的场景。插件适用于在Docker容器中开发和调试的场景。C/C++插件可以帮助你在VSCode中进行C++开发和调试,同时可以配置远程调试。使用这些工具和插件,你可以在Windows上通过VSCode远程连接到Linux机器或Docker容器,实现无缝的开发和调试体验。原创 2025-01-07 23:55:31 · 989 阅读 · 0 评论 -
在 Linux 上调试 C++ 程序
GDB是最常用的调试器,适合大多数调试场景。VSCode提供了图形化的调试界面,结合 GDB 或 LLDB,适合喜欢图形化工具的开发者。LLDB是另一个强大的调试器,尤其适合 macOS 和现代 Linux 系统。Valgrind和专注于内存问题的检测,帮助你发现潜在的内存泄漏和非法访问。GProf用于性能分析,帮助你优化程序的性能。原创 2025-01-07 22:53:31 · 958 阅读 · 0 评论 -
什么是 LuaJIT?
LuaJIT是一个高效的即时编译器(JIT,Just-In-Time Compiler)实现,专门用于将Lua代码编译为机器代码,从而极大地提升了 Lua 代码的执行速度。LuaJIT 继承了 Lua 语言的简洁性和灵活性,同时通过 JIT 编译技术提高了性能,使其在高性能计算的场景下成为理想选择。LuaJIT是 Lua 语言的高性能实现,使用 JIT 编译技术显著提高了 Lua 的执行速度。应用场景包括游戏开发、嵌入式系统、高性能计算和自动化脚本等。原创 2025-01-06 22:39:11 · 2300 阅读 · 0 评论 -
什么是 pybind11?
pybind11pybind11是一个强大的工具,它使得 C++ 和 Python 可以轻松互操作。它让开发者能够在 Python 中直接调用 C++ 编写的高效算法,而不需要重写 Python 代码。通过pybind11,我们可以将现有的 C++ 库集成到 Python 中,或者将性能关键的部分用 C++ 实现,以便在 Python 中使用。通过pybind11,你可以将 C++ 中的类和函数暴露给 Python。你可以通过pybind11。原创 2025-01-06 22:36:36 · 1538 阅读 · 0 评论 -
C++移动语义
在 C++ 中,移动语义是一种优化机制,允许资源(例如动态分配的内存、文件句柄、数据库连接等)从一个对象 “转移” 到另一个对象,而不是通过复制来共享资源。它通过将对象的内部资源的所有权从一个对象转移到另一个对象,从而避免了不必要的深拷贝,显著提高了性能,尤其在处理大型数据时。移动语义依赖于右值引用(rvalue references)和移动构造函数移动赋值运算符的支持。通过这些机制,C++ 能够避免昂贵的对象拷贝操作,而是通过“移动”数据的所有权来高效地管理资源。移动语义通过右值引用和移动构造函数。原创 2025-01-05 21:28:46 · 998 阅读 · 0 评论 -
解决 C++ 中头文件相互引用和解耦问题
前向声明:减少头文件间的相互依赖,避免不必要的引用。将实现转移到源文件:让头文件只包含接口声明,避免实现代码直接暴露。接口和抽象类:使用纯虚类或接口来解耦类之间的依赖。依赖注入:通过构造函数或方法注入依赖,减少类间的直接依赖关系。智能指针:利用智能指针来管理对象的生命周期,避免内存管理问题。分离接口和实现:将接口和实现分开,提供更灵活的替换机制。这些方法和思想的目标是将模块化的设计与低耦合、高内聚结合起来,提高代码的可维护性、可扩展性和复用性。原创 2025-01-05 15:50:18 · 1157 阅读 · 0 评论 -
什么是 C++ 的序列化?
序列化(Serialization)是指将对象的状态转换为可以存储或传输的格式的过程。它使得对象能够以二进制或文本的形式被保存到文件中,或者通过网络发送到远程计算机上,稍后可以重新构造出来(称为反序列化或 deserialization)。在 C++ 中,序列化的目的是将内存中的对象转换成一种持久化的格式,以便它可以存储在文件中、发送到网络、或者存储在数据库中,并且之后能够恢复为原始对象。序列化不仅涉及数据本身,还包括对象的结构和状态。C++ 的序列化。原创 2025-01-04 23:47:41 · 897 阅读 · 0 评论 -
什么是 GTest?
GTest(Google Test)是一个由 Google 开发并开源的 C++ 单元测试框架。它提供了一组强大的功能和工具来帮助开发人员为他们的 C++ 代码编写和执行单元测试。单元测试是软件开发中的一种常见实践,它指的是对单独的代码单元(如函数、类方法等)进行独立验证,确保每个部分都按预期工作。GTest 是用于 C++ 中实现这种测试的一种工具。自动化测试过程提供易于理解和管理的测试输出提供各种测试断言(例如检查函数输出是否符合预期)原创 2025-01-04 23:13:51 · 1328 阅读 · 0 评论 -
C++20 引入了协程
C++20 引入的协程为处理异步任务和并发编程提供了更简洁的方式。通过使用co_awaitco_return和co_yield,协程能够在异步操作时挂起执行,等待结果返回或生成多个值,从而避免了传统的回调地狱或复杂的线程管理。co_await用于挂起协程并等待异步操作。co_return用于返回一个值并结束协程。co_yield用于生成器模式,逐个返回值并暂停协程,直到恢复。原创 2025-01-03 05:22:19 · 1356 阅读 · 0 评论 -
C++11 的线程相关
C++11 的线程库和相关工具为我们提供了丰富的工具来管理线程、进行异步任务和实现线程间同步。提供了最基础的线程功能,而std::async和提供了更高层次的异步任务管理,使得线程编程更加简洁。通过std::mutex等同步工具,我们可以确保线程安全地共享资源。在实际开发中,我们推荐尽量使用std::async和,以避免直接暴露线程细节,减少并发编程的复杂度。原创 2025-01-03 05:21:11 · 788 阅读 · 0 评论 -
C++原子变量
原子变量是 C++11 提供的强大工具,通过保证原子操作的不可分割性,使得多线程编程中对共享资源的访问变得安全和高效。原子变量的使用可以减少加锁操作,避免锁竞争,提升性能。C++ 提供了多种原子操作,如storeloadfetch_addfetch_subexchange等,可以帮助开发者实现高效的无锁编程。原创 2025-01-02 02:30:00 · 1203 阅读 · 0 评论 -
什么是线程局部存储(TLS)
线程局部存储(Thread Local Storage,简称 TLS)是操作系统或编程语言提供的一种机制,用于在多线程程序中为每个线程创建独立的变量副本,使得每个线程都能有自己独立的存储空间。这样,多个线程在访问这些变量时不会互相干扰,避免了数据竞争和线程同步的复杂性。每个线程都拥有该变量的独立副本。当线程结束时,线程局部存储的资源会自动释放。每个线程访问自己的副本时不需要加锁,因此访问速度比共享数据更快。线程局部存储(TLS)原创 2025-01-02 02:00:00 · 740 阅读 · 0 评论 -
为什么需要 std::call_once?
是 C++ 标准库中的一个函数,用来确保某个操作仅被执行一次,通常用于线程安全的初始化操作。它常与结合使用,后者用于标记某个操作是否已经执行过。原创 2025-01-01 21:55:25 · 349 阅读 · 0 评论 -
认识算法与迭代器在 C++ 中的应用
从纯理论的角度来看,算法是一系列定义明确的操作步骤,通常在有限的步骤内得到结果。计算机科学中有很多种算法,比如排序算法、查找算法、遍历算法、加密算法等。它们在不同的场景下提供不同的解决方案。然而,在C++中,算法的定义要更为狭窄。它指的是工作在容器上的一些泛型函数,这些算法会对容器内的元素进行各种操作。C++ 标准库提供了上百个算法,涵盖了绝大部分日常开发需求,像removesortmake_heap等,能够帮助我们快速高效地完成常见操作。然而,如果我们“说白了”,所有的算法本质上都是通过for或。原创 2025-01-01 09:35:27 · 705 阅读 · 0 评论 -
C++ 字符串处理
C++ 的字符串处理提供了强大的功能,但也有其复杂性。在大多数应用中,足以应对大多数需求。为了避免性能问题,可以使用作为优化手段,在处理不需要修改的字符串时,减少不必要的复制。此外,正则表达式和字符串转换函数也极大地扩展了 C++ 字符串处理的能力。希望这篇文章能帮助你更好地掌握 C++ 中字符串的处理技巧!原创 2024-12-31 06:13:51 · 1067 阅读 · 0 评论 -
C++容器
对于有序容器,需要定义比较规则。原创 2024-12-31 06:13:18 · 663 阅读 · 0 评论 -
C++ 函数式编程Lambda表达式
Lambda 表达式:C++11 引入的匿名函数,支持捕获外部变量并简洁地表达函数逻辑。捕获列表-> 返回类型 { 函数体 }变量捕获规则[=]按值捕获外部变量的副本。[&]按引用捕获外部变量的引用。泛型 Lambda:C++14 引入,允许 Lambda 使用auto来接受任何类型的参数,实现类似模板函数的效果。原创 2024-12-30 06:09:34 · 1372 阅读 · 0 评论 -
C++ 异常
C++ 的异常机制基于继承体系,通过类的继承关系来区分不同类型的异常。所有的标准异常类都继承自类,并根据不同的错误类型分为若干类别。我们会看到等基本类型异常类,它们之间有明确的层次关系。C++ 的异常机制通过层次分明的异常类体系,使得不同类型的错误能够得到合理的分类和处理。我们通过使用try-catch语句来捕获异常,并且根据实际需要选择合适的异常类型,如 `std::runtime_errorstd::bad_alloc` 等。原创 2024-12-30 05:07:36 · 1087 阅读 · 0 评论 -
C++中的裸指针(Naked Pointer)、智能指针(Smart Pointer)与RAII惯用法
裸指针是直接指向内存位置的原始指针,而智能指针则是对裸指针的封装,提供了内存自动管理的功能。RAII 是 C++ 中一种非常重要的惯用法,指的是资源的获取(如内存、文件、数据库连接等)与对象的初始化绑定,资源的释放与对象的销毁绑定。通过智能指针,C++ 程序员无需显式地管理内存的分配和释放,智能指针会在对象生命周期结束时自动销毁资源。智能指针是对裸指针的封装,它能够自动管理内存并遵循 RAII 原则,确保资源在不需要时被自动释放。:智能指针工厂函数,用于安全创建智能指针,避免裸指针为空指针(未初始化)。原创 2024-12-29 04:31:24 · 1196 阅读 · 0 评论 -
C++常用特性
让构造函数之间可以相互调用,避免重复的初始化逻辑。原创 2024-12-28 22:35:08 · 603 阅读 · 0 评论 -
default、delete 和 explicit
在 C++11 中,增加了几个新的关键字和特性,它们用来更精确地控制类的基本函数(如构造函数、拷贝构造函数、赋值运算符等)。其中,defaultdelete和explicit都是用于这些基本函数的关键字,目的是让程序员在特定的情况下更加灵活地控制类的行为。原创 2024-12-28 22:29:58 · 940 阅读 · 0 评论 -
`const`、`volatile` 和 `mutable`
const提供了编译期的不可变性,能够防止意外修改,提高代码安全性。volatile是运行时的优化屏障,用于应对外部不可控的值变化,但不提供线程安全。mutable允许在逻辑上不可变的情况下,修改一些特殊变量。原创 2024-12-27 22:44:34 · 820 阅读 · 0 评论 -
C++自动推导类型
auto。原创 2024-12-27 02:46:52 · 776 阅读 · 0 评论 -
外部化内部类
将类的内部类提取到外部命名空间是一种常见的设计模式,它能够有效地降低原来类的复杂度和耦合度。通常,内部类可能是对外部类的某种细节封装,但如果它们本身也具有独立的职责和功能,应该考虑将它们提取到外部名字空间。:外部类的接口不再直接暴露复杂的内部实现,外部类只需要引用这些提取到名字空间的类,而不需要将它们嵌套在自己内部。要定义一个新的名字空间,将一个类内部的类提到外部,目的是降低类的耦合度和复杂度,这通常可以通过。类的内部类,而是一个独立的类,外部可以直接使用。类的接口更简洁,且没有被复杂的内部类所干扰。原创 2024-12-26 23:16:28 · 307 阅读 · 0 评论 -
constexpr 的概念及用途
constexpr。原创 2024-12-26 23:15:53 · 1198 阅读 · 0 评论 -
静态断言(Static Assertions)在 C++ 中的使用
静态断言是通过。原创 2024-12-25 19:50:36 · 731 阅读 · 0 评论 -
C++中属性(Attributes)
通过以上讲解和示例,我们了解了 C++ 中常见的属性及其使用场景。属性可以帮助我们控制编译过程中的一些行为,如强制内联、标记弃用的函数、提示编译器优化等。通过合理使用属性,我们可以提高代码的可读性、性能和可维护性。原创 2024-12-25 19:50:13 · 1333 阅读 · 0 评论 -
C++ 面向对象相关的关键字和概念
在 C++ 中,面向对象的核心就是 类(class) 和 对象(object),其中类是一个模板或蓝图,定义了对象的属性(成员变量)和行为(成员函数)。析构函数是与构造函数相对的特殊成员函数,它会在对象生命周期结束时自动调用,用于释放对象占用的资源。是一种特殊的函数,它不是类的成员函数,但它可以访问类的私有和保护成员。指针是一个隐式存在的指针,通常不需要显式声明,但在一些特定情况下,它是非常有用的,尤其是当函数参数和成员变量同名时。默认情况下,类的成员是私有的,外部代码无法直接访问它们。原创 2024-12-24 00:12:38 · 1425 阅读 · 0 评论 -
如何理解C++ 编译阶段
这个阶段的目标是将原始的源代码文本分解成更小的、能够被编译器理解的部分,这些部分称为“词法单元”或。在这一阶段,编译器只会处理模板的类型结构,并生成与具体类型匹配的代码,而不关心运行时的具体数据。在这一阶段,编译器会检查源代码是否符合语法规则,确保代码的结构是合法的。,即它们在代码编译时确定了类型和结构,但编译器并不会处理这些类型在运行时的具体数据值。在编译时,编译器会根据实际使用的类型来实例化模板,生成相应的代码。等关键字定义的类型,而不是运行时的变量。,在编译时,编译器根据传入的类型生成相应的代码。原创 2024-12-24 00:12:15 · 1205 阅读 · 0 评论 -
C++中预定义宏
C++中有许多预定义宏,这些宏在程序编译时由编译器自动定义,并可以在代码中使用。是一个宏,当代码是严格符合标准的 C 语言程序时(即不使用任何扩展),这个宏会被定义。是 Microsoft 编译器特有的一个关键字,用于指定函数、变量或类型的属性。是一个宏,用于表示当前编译环境支持的 C++ 标准版本。:通常用于平台特定的编译选项或特性,以判断是否在 GCC 编译器下编译代码。是用于宏定义中的可变参数的宏,它代表宏调用时传递给宏的所有额外参数。:用于记录代码编译的时间,通常在日志或调试输出中使用。原创 2024-12-23 02:35:36 · 1040 阅读 · 0 评论