C/C++语言
文章平均质量分 93
“雄关漫道真如铁,而今迈步从头越”,这是一个编程的世界,而现在才刚刚开始。
Once-Day
软件工程师,编程爱好者,技术博客创作者,专注于嵌入式Linux C/C++领域,擅长高性能编程和疑难问题定位。二年MCU软件开发(智能小车),四年Linux软件开发(网关防火墙)。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++之《程序员自我修养》读书总结(7)
《程序员自我修养》读书总结(七)探讨了动态链接的核心机制。静态链接会导致代码冗余和更新困难,而动态链接通过运行时符号解析实现资源共享。关键点包括:1)动态链接器在程序启动时加载共享对象并完成重定位;2)地址无关代码(PIC)通过相对寻址避免修改代码段;3)延迟绑定(PLT/GOT)机制将函数解析推迟到首次调用时,提升启动性能;4)ELF文件中.dynamic段保存依赖信息,.got和.plt段协作实现动态绑定。这些技术共同解决了静态链接的资源浪费问题,支持灵活的模块化架构。原创 2026-02-27 23:39:43 · 2080 阅读 · 23 评论 -
C++之《程序员自我修养》读书总结(6)
本文探讨了可执行文件与进程的关系,从程序装载到进程虚拟空间的构建过程。程序作为静态实体,通过操作系统映射为动态进程实例,一个程序可对应多个进程。现代系统采用页映射机制实现按需装载,利用虚拟内存技术提升内存利用率。文章分析了进程虚拟空间的布局原理,包括ELF文件的执行视图优化、段映射机制以及BSS段的零填充实现。通过操作系统视角,揭示了进程建立时的环境构建过程,包括页表初始化、按需调页等核心机制,展现了软硬件协同设计的精妙之处。原创 2026-02-27 23:34:34 · 774 阅读 · 2 评论 -
GCC编译(7)链接脚本LinkerScripts
本文介绍了GCC编译中的链接脚本(Linker Scripts)功能。链接脚本用于精确控制可执行文件的布局,定义代码、数据等内容的地址分布和加载策略。文章详细解析了链接脚本的基本概念、语法结构和常用命令。文章适用于需要精细控制内存布局的嵌入式开发场景,帮助开发者理解和使用链接脚本这一强大工具。原创 2026-02-25 23:37:12 · 1110 阅读 · 17 评论 -
C++之《程序员自我修养》读书总结(5)
《程序员自我修养》读书总结:Windows PE/COFF格式解析 本文深入探讨了Windows平台的核心二进制文件格式PE/COFF。主要内容包括: 发展历史:从Unix的COFF格式演变到Windows的PE格式,再到64位的PE32+扩展,保持兼容性的同时支持新特性。 mingw-w64工具链:介绍这套跨平台编译工具链的组成、用途和安装配置方法,支持在Linux/macOS上交叉编译Windows程序。 文件结构:详细解析PE文件的映像头和段表结构,包括_IMAGE_FILE_HEADER各字段含义,原创 2026-02-22 20:59:39 · 1992 阅读 · 3 评论 -
C++之《程序员自我修养》读书总结(4)
本文是《程序员自我修养》读书总结的第四部分,主要探讨静态链接的关键技术。内容包括空间和地址分配策略(相似段合并)、符号解析与重定位机制、COMMON块处理规则、C++特性支持(如模板实例化处理),以及静态库链接原理。文章详细分析了链接器如何通过两阶段处理(空间分配+符号解析)将分散目标文件组织为可执行映像,并深入讨论弱符号、函数级别链接、ABI兼容性等核心概念。通过具体示例和流程图,展现了从编译单元到最终二进制文件的转换过程。原创 2026-02-22 20:53:12 · 855 阅读 · 1 评论 -
GCC编译(6)静态库工具AR
本文介绍了GCC工具链中的AR(Archive)命令,主要用于创建、修改和提取静态库文件。文章概述了AR的基础使用场景,包括创建档案文件、查看内容、添加/删除成员等操作。重点解析了档案文件的本质特性:作为链接优化的二进制容器,其符号索引机制(armap)可显著提升链接效率。文章还对比了普通archive和thin archive的区别,前者完全拷贝对象文件适合发布,后者仅保存引用路径适合本地构建。最后详细列出了AR命令的参数说明和使用方法,帮助开发者高效管理静态库文件。原创 2026-02-20 11:40:46 · 2016 阅读 · 23 评论 -
GCC编译(5)头文件处理
本文主要介绍了GCC编译器处理头文件的相关技术和最佳实践。内容涵盖头文件预处理机制、编译规则、防止重复包含的方法、C/C++兼容性处理以及依赖关系生成等方面。重点讨论了预处理阶段宏展开和路径搜索策略,头文件定义与声明的规范使用,include guard和#pragma once的对比选择,跨语言接口设计中的extern "C"用法,以及构建系统中自动生成头文件依赖关系的技巧。文章通过具体示例和参数说明,为开发者提供了处理头文件相关问题的实用指导,有助于提高代码质量和构建效率。原创 2026-02-20 11:31:36 · 807 阅读 · 1 评论 -
GCC编译(4)构造和析构函数
本文探讨了GCC编译器中构造和析构函数的实现机制。从程序初始化视角分析了广义构造/析构过程,包括全局对象初始化、静态变量处理等。详细介绍了GCC特有的__attribute__((constructor))和__attribute__((destructor))属性,它们通过.init_array和.fini_array段实现函数自动调用。文章还解析了优先级控制、执行顺序等特性,并通过实例展示了从源码到ELF二进制文件的实现细节,包括符号表分析、段结构验证等,为理解程序启动和终止流程提供了技术参考。原创 2026-02-19 12:22:00 · 806 阅读 · 4 评论 -
GCC编译(3)常见编译选项
本文介绍了GCC编译器的常见编译选项及其功能。主要内容包括:基础控制选项(-c、-o、-E、-S、-v等)用于控制编译流程;优化选项(-O0~-O3、-Os、-flto等)调整编译优化级别;警告诊断选项(-Wall、-Wextra、-Werror等)提高代码质量;宏与头文件控制(-D、-I)影响预处理行为;链接选项(-L、-l、-static等)控制库链接方式;语言标准选项(-std)指定编译标准。文章还通过示例展示了各选项的具体应用场景,帮助开发者更高效地使用GCC进行代码构建和优化。原创 2026-02-19 11:48:10 · 1272 阅读 · 13 评论 -
GCC编译(2)C语言交叉编译
文章摘要: 本文介绍了GCC交叉编译C语言程序的基本方法。首先通过简单的多文件编译示例展示了增量编译的优势,详细讲解了Makefile的编写规则,包括变量定义、模式匹配和伪目标的使用。然后重点阐述了ARM平台交叉编译环境的搭建,包括工具链选择、Ubuntu系统下的安装配置方法,以及32位和64位编译器的使用示例。最后简要说明了本地与远程服务器之间的文件传输方法,为跨平台开发提供了完整的工具链指导。文章适合Linux环境下进行C语言开发和交叉编译的初学者参考。原创 2026-02-14 23:54:40 · 763 阅读 · 1 评论 -
GCC编译(1)入门概述
本文概述了GCC编译器的发展历程、编译流程和主要组件。GCC最初作为GNU C Compiler,逐步发展为支持多语言的GNU Compiler Collection。其编译流程分为预处理、编译、汇编和链接四个阶段,每个阶段由不同工具完成。文章详细介绍了各阶段的功能和对应命令,并列举了GCC的主要组件及其作用,包括c++、g++、gcj等语言驱动程序和libgcc、libstdc++等核心库。GCC的分阶段设计和模块化架构使其成为Linux系统重要的构建工具。原创 2026-02-14 23:43:04 · 886 阅读 · 1 评论 -
C++之《程序员自我修养》读书总结(3)
本文节选自《程序员自我修养》读书总结第三部分,重点探讨目标文件格式及其核心概念。文章首先指出目标文件与可执行文件本质上是同一套二进制格式在不同阶段的表现形式,详细分析了ELF和PE文件的结构特点及其历史演进。通过实例展示了代码段、数据段和bss段的实际布局,揭示了编译器优化策略对空间利用的影响。最后通过size和objdump工具的实际输出,直观呈现了目标文件中各段的组织方式及其内存映射关系,为理解程序构建流程提供了技术基础。原创 2026-02-10 11:50:54 · 1351 阅读 · 25 评论 -
C++之《程序员自我修养》读书总结(2)
《程序员自我修养》读书总结(二):编译与链接的深层逻辑 本文深入解析了C程序从源码到可执行文件的完整构建过程。通过GCC编译的四个阶段(预处理、编译、汇编、链接),揭示了程序如何从"人类可读描述"转化为"操作系统可装载实体"。重点剖析了链接器的核心功能:地址空间分配、符号决议和重定位,解释了静态链接中启动文件、用户代码和标准库的交互机制。同时阐述了编译器工作的多阶段特性(词法分析→语法分析→语义分析→中间代码生成→目标代码生成),以及链接器在程序语义落地中的关键作用。原创 2026-02-10 10:53:39 · 829 阅读 · 7 评论 -
数据结构(1)整体认知与框架思维
从宏观视角看,数据结构并不是零散孤立的知识点,而是一套可以被高度抽象和统一理解的组织模型。在高层次上,几乎所有常见数据结构都可以归结为数组与链表两种基础形态。原创 2026-01-30 09:45:35 · 876 阅读 · 7 评论 -
C++之《Effective C++》读书总结(4)
摘要: 本文探讨了《Effective C++》中模板与泛型编程的核心原则。首先分析了隐式接口与编译期多态的特性,对比了class显式接口的运行期多态差异。其次解析了typename在模板参数声明和嵌套从属类型中的双重作用。针对模板继承问题,提出了通过this->或基类限定符访问基类成员的方法。此外,建议抽离与模板参数无关的代码以减少膨胀,并通过成员函数模板实现类型兼容性,提升泛型设计的灵活性与安全性。这些技巧对于编写高效、可维护的C++模板代码至关重要。原创 2026-02-06 23:08:01 · 921 阅读 · 19 评论 -
C++之《程序员自我修养》读书总结(1)
《程序员自我修养》读书总结(一)深入探讨了程序从编译到运行的全过程。文章解析了编译器如何将高级语言转换为机器码,详细介绍了可执行文件的结构与组织方式,包括ELF格式的段布局和元数据。通过分析标准库的实现机制,解释了头文件包含与链接过程的区别。文章还对比了不同编译器、硬件平台和操作系统下的编译结果差异,并完整梳理了"Hello World"程序从装载到退出的执行流程,包括main函数前后的运行时初始化工作。最后探讨了无操作系统环境下运行程序所需的条件,展现了底层系统与程序运行的密切关系。原创 2026-02-06 23:01:55 · 816 阅读 · 2 评论 -
C++之《Effective C++》读书总结(3)
本文摘要总结了《Effective C++》第三部分关于实现优化的关键建议: 推迟变量定义:在首次使用时定义变量,避免不必要的构造/析构开销,同时提高代码可读性。建议定义时直接初始化而非先定义后赋值。 减少类型转换:避免使用C风格强制转换,优先使用语义明确的新式转换(static_cast等)。特别警惕dynamic_cast的性能开销和多态设计问题。 避免返回内部句柄:不要返回指向对象内部成员的指针/引用,以维护封装性,防止const语义破坏和悬空引用问题。 异常安全保证:确保代码在异常发生时至少满足基本原创 2026-02-03 22:26:55 · 1342 阅读 · 16 评论 -
C++之《Effective C++》读书总结(2)
在 C++ 中,“以对象管理资源”并不是一种语法技巧,而是一种资源生命周期与对象生命周期绑定的设计哲学。RAII(Resource Acquisition Is Initialization)的核心思想是:**资源一旦被成功获取,就必须立刻交由对象托管**。原创 2026-01-30 10:02:51 · 1303 阅读 · 18 评论 -
C++之《Effective C++》读书总结(1)
**将 C++ 视为一个语言联邦(C、Object-Oriented C++、Template C++、STL)**,是《Effective C++》中极具洞察力的抽象。这种观点强调:C++ 并非单一范式语言,而是由多个相互重叠、规则各异的子语言共同构成。理解这一点,有助于开发者在不同语境下采用恰当的思维模型,避免因误用某一子语言的规则而引发隐蔽缺陷或性能问题。原创 2026-01-27 15:39:29 · 2037 阅读 · 20 评论 -
CC++八股文之内存泄漏
文章摘要:C/C++内存泄漏问题分析与定位 本文系统分析了C/C++程序中的内存泄漏问题。首先明确定义了内存泄漏的本质是"生命周期失配",即程序申请内存后失去释放控制权。文章详细划分了可能发生泄漏的内存区域(堆、文件映射段)和不会泄漏的区域(栈、只读段等)。通过三个阶段阐述了泄漏的危害:从进程内存缓慢增长到系统OOM崩溃。原创 2026-01-17 22:12:34 · 1196 阅读 · 0 评论 -
CC++八股文之内存
本文深入探讨了C/C++中的内存管理核心概念。首先阐述了内存本质,指出内存作为连续字节数组的特性,以及地址空间和字节序等关键概念。接着详细分析了程序内存分区,包括代码区、全局/静态存储区、栈区、堆区和常量区的特点及作用。随后对比了指针与引用的区别,并解析了值传递、引用传递和指针传递三种参数传递方式的异同。最后介绍了C++特有的RAII(资源获取即初始化)技术,强调通过对象生命周期管理资源的重要性。这些基础知识对于理解C/C++内存机制和编写高效安全代码至关重要。原创 2026-01-14 21:54:41 · 1035 阅读 · 0 评论 -
CC++八股文之面对对象(1)
本文摘要: C++面向对象编程三大特性:封装(隐藏实现细节)、继承(代码复用与扩展)和多态(接口统一实现多样)。对比面向过程与面向对象编程范式,分析各自适用场景。详细解析class与struct的关键区别:默认访问权限和继承方式不同。阐述类对象构造/析构顺序(基类→成员→派生类)及生命周期管理(栈/堆/静态对象)。重点讨论深拷贝(复制指针指向内容)与浅拷贝(仅复制指针地址)的区别及风险,强调析构函数不应抛出异常。全文涵盖C++核心语法要点,适合面试准备和知识梳理。原创 2026-01-11 20:59:41 · 1042 阅读 · 1 评论 -
CC++八股文之基础语法(2)
C/C++基础语法摘要 本文介绍了C++匿名函数(Lambda表达式)、指针和右值引用的核心概念: 匿名函数:C++11引入的Lambda表达式语法,本质是编译器生成的闭包类。支持捕获上下文变量、内联定义函数对象,提升代码简洁性和性能。 指针:存储内存地址的变量,提供直接内存访问能力。关键特性包括动态内存管理、构建数据结构等,但也易引发野指针、内存泄漏等安全问题。 右值引用:C++11引入的"T&&"语法,用于绑定临时对象,实现移动语义和完美转发。原创 2025-12-25 21:59:49 · 1170 阅读 · 0 评论 -
CC++八股文之基础语法(1)
本文总结了C/C++编程中的五个关键语法点:volatile、static、const关键字的作用与区别,typedef和#define的差异,以及不同类型变量的特性。volatile确保变量从内存读取而非寄存器缓存;static根据上下文改变变量生命周期和作用域;const保证变量不可变性;typedef提供类型安全别名,而#define仅做文本替换。这些概念对理解底层编程、优化代码性能及确保程序正确性至关重要。原创 2025-12-25 21:56:48 · 955 阅读 · 0 评论 -
C之(14)gcov覆盖率
在现代软件开发过程中,代码质量和可靠性至关重要。为了确保软件的正确性和稳定性,软件测试已成为开发流程中不可或缺的一部分。而在众多软件测试方法中,代码覆盖率测试因其客观、量化的特点而备受关注。代码覆盖率测试是一种白盒测试方法,旨在衡量测试用例对代码的执行覆盖程度。通过插桩等技术手段,代码覆盖率测试工具可以记录并统计测试过程中每一条代码的执行情况,并以此计算出多种覆盖率指标,如语句覆盖率、分支覆盖率、条件覆盖率等。这些指标从不同维度反映了代码的测试充分性,为发现未被测试覆盖的代码片段提供了量化依据。原创 2025-01-01 14:17:00 · 1342 阅读 · 7 评论 -
C++(1)基础语法
C++是一种通用编程语言,由Bjarne Stroustrup在贝尔实验室工作时于1979年开始开发。C++最初被命名为"C with Classes",旨在扩展C语言以支持面向对象编程。随着时间的推移,C++不断发展,引入了许多新特性,如异常处理、模板、标准模板库(STL)等。1998年,C++第一个国际标准ISO/IEC 14882:1998发布,使其成为一种成熟、稳定且广泛使用的编程语言。原创 2024-08-31 15:59:22 · 3884 阅读 · 64 评论 -
代码训练LeetCode(12)二进制求和
二进制加法本质上和十进制加法相似,只不过它只包含两个数字:0和1。我们可以使用一个指针从两个字符串的末尾开始向前遍历,模拟手工加法的过程。同时,我们需要一个变量`carry`来记录进位。对于每一对位,我们需要计算它们的和再加上`carry`,然后更新`carry`。原创 2024-03-15 00:00:33 · 1294 阅读 · 27 评论 -
代码训练LeetCode(11)删除有序数组中的重复项II
给定一个有序数组 `nums`,你需要原地修改这个数组,去除那些出现超过两次的重复元素。这里的“原地”意味着你不能使用额外的数组结构来辅助完成这个任务;仅能使用有限的额外空间(O(1)),也就是说,除了几个变量以外,不得使用额外的空间资源。由于数组已经有序,所以重复的元素一定是连续的。我们可以使用两个指针来解决这个问题原创 2024-03-14 23:58:19 · 1484 阅读 · 4 评论 -
代码训练LeetCode(7)删除有序数组中的重复项
有一个数组 nums,它是非严格递增的,也就是说,数组中的元素可能会有重复,并且它们是按照顺序排列的。你的任务是要在不改变元素相对顺序的情况下,仅保留每个元素的一个副本,并删除所有的重复元素。你需要在不使用额外数组的条件下完成这个操作,这就意味着你需要在原地修改输入的数组 nums。原创 2024-03-10 23:00:39 · 1494 阅读 · 30 评论 -
代码训练LeetCode(6)编辑距离
这种表面一看,似乎是个字符串问题,但是如果按照分类匹配去做,怕是很难得出合理的方法。求两个字符串的编辑距离实际是个动态规划入门题目,动态规划算法是解决这个问题的标准方法。原创 2024-03-09 23:08:34 · 2785 阅读 · 54 评论 -
代码训练LeetCode(5)最长连续序列
这个问题是在寻找最长连续序列的长度,但不要求这些序列在原数组中是连续的。要在 O(n) 时间复杂度内解决这个问题,我们可以利用哈希表(在 C 中通常使用散列表或字典类型的数据结构)。原创 2024-03-09 23:06:33 · 1419 阅读 · 13 评论 -
代码训练LeetCode(4)字母异位词
题目要求我们编写一个函数,这个函数需要判断两个字符串 `s` 和 `t` 是否是字母异位词。如果一个字符串的字母重新排列后能够得到另一个字符串,那么这两个字符串互为字母异位词。换句话说,两个字符串有相同的字母和相同数量的每个字母。可以使用一个大小为 26 的整数数组来代替哈希表。数组的每个位置对应一个字母,值为该字母在字符串 `s` 中出现的次数。原创 2024-03-07 23:39:27 · 1262 阅读 · 24 评论 -
代码训练LeetCode(3)移除元素
解题思路很简单,从数组的第一个元素开始,一直检查到最后一个元素,当你找到一个`val`时,你可以将它和数组最后一个元素交换,然后“丢弃”掉最后一个元素。这样,你就在不增加额外空间的情况下,原地修改了数组。重复这个过程,直到你检查完所有的元素。原创 2024-03-07 23:33:14 · 873 阅读 · 3 评论 -
OD(4)之libunwind打印堆栈信息
libunwind是一个用于确定程序的调用栈的便携式和高效的编程库。它最初是为了改善在IA-64上的Linux系统上的程序性能分析和错误调试,但后来被扩展到支持其他架构。libunwind项目始于2000年代初期,并且随着时间的推移,它已经被各种系统和架构所采纳。libunwind提供了一组API,允许程序在运行时查询和设置调用帧的状态,主要用于堆栈跟踪(stack unwinding)。这个功能对于异常处理、程序调试以及任何需要检查程序调用历史的场景都非常有用。便携性:支持多种处理器架构和操作系统。原创 2024-01-12 00:18:06 · 4390 阅读 · 0 评论 -
编码风格之(3)GUN软件标准风格(1)
GNU编码标准》(GNU Coding Standards)是由GNU项目制定的一系列详细的编码准则和最佳实践。这些标准旨在确保GNU软件的质量和维护性,并且为开发者提供一致的编程风格和实践。GNU编码标准的内容不仅仅局限于代码风格,还包括软件设计、文档、版权和其他开发实践。Preliminaries(前言),此部分介绍了GNU编码标准的目的和重要性,以及为什么应该遵循这些标准。Writing Robust Programs(编写健壮的程序),这一章节提供了编写健壮、安全和可移植代码的建议。原创 2024-01-07 23:18:23 · 1508 阅读 · 0 评论 -
编码风格之(2)C语言规范(Linux内核风格)
本文总结并且描述Linux内核的编码风格,这是一份存在很久的文档,其实每一种编码风格都有其侧重点,也不会面面俱到,对于我们来说,不妨放下内心的偏见,博纳众家之长,丰富认知和经验。这是一个简短的文档,描述了linux内核的首选编码风格。编码风格是非常个人化的,我不会把我的观点强加给任何人,但这是我必须能够维护的任何东西,我也希望它适用于大多数其他东西。请至少考虑一下这里提出的观点。首先,我建议打印一份GNU编码标准的副本,不要读它。烧了它们,这是一个很好的象征性姿态。原创 2023-12-30 00:14:54 · 1562 阅读 · 0 评论 -
编码风格之(1)C语言建议规范
介绍锐捷风格的C语言规范原创 2023-12-27 22:30:53 · 1219 阅读 · 0 评论 -
(转载)一文彻底搞懂并发编程与内存屏障(IT知识刺客)
详细而生动的解释了内存屏障的概念,并且结合多核架构进行分析,最后结合实例讲解,深入浅出,收益颇多。转载 2023-12-11 22:59:37 · 654 阅读 · 0 评论 -
计基之(8)通用优化策略
Author:onceday Date:2023年8月22日长路漫漫,而今才刚刚启程!Linux C++性能优化:从编译器到代码,探究高性能C++程序的实现之道 (qq.com)《C++性能优化指南》, [美] Kurt Guntheroth 著, 杨文轩 译, 人民邮电出版社.注: 本书大部分内容摘抄于《C++性能优化指南》,仅供学习和交流之用。优化是一项编码活动。在传统的软件开发过程中,直到编码完成,项目进入了集成与测试 阶段,能够观察到程序整体的性能时,才会进行优化。原创 2023-11-12 23:52:28 · 440 阅读 · 0 评论 -
C之(10)CMocka-单元测试框架使用
CMocka 是一个用于 C 语言的单元测试框架,它是 Check 单元测试框架的一个分支。CMocka 的设计哲学是“只做一件事,但做得好”,这使得它成为一个轻量级、易于使用的工具。它为测试 C 代码提供了一种简单、稳定的方法。轻量级和模块化:CMocka 不需要复杂的设置,不依赖于其他库,且不会大幅度地增加你的项目大小。你可以简单地将其添加到你的 C 项目中,然后开始编写测试。模拟函数:在进行单元测试时,我们通常需要模拟一些函数以便在特定条件下测试我们的代码。原创 2023-11-03 23:24:52 · 4390 阅读 · 0 评论
分享