debugger(一):打断点的实现以及案例分析 〇、前言最近在学习 debugger 的实现原理,并按照博客实现,是一个很不错的小项目,这是地址。由于 macOS 的问题,系统调用并不完全相同,因此实现了两个版本分支,一个是 main 版本分支(macOS M1 silicon),另一个是 linux 版本分支(Ubuntu 20.04 x86),这是仓库地址。以下以及后都用 linux 版本代码阐述其原理。 一、断点创建这很简单,主要是由 2024-05-25 系统编程 > C++ > debugger #c++ #debugger
C++内存模型 〇、前言本文将会讨论:Linux 下 C、C++的内存模型。 一、C以下是一个示例,通过打印地址的值以及借助 nm 工具,来判断内存区域: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566#incl 2024-05-20 C++ #c++
C++:再谈智能指针 〇、前言本文会讨论 shared_ptr、weak_ptr、unique_ptr以及智能指针的相关注意事项。 一、具体实现关于 shared_ptr、weak_ptr,虽然具体的实现细节可能根据不同的编译器和版本有所不同,下面仅仅重点介绍了 std::shared_ptr 和 std::weak_ptr 析构函数的伪代码,这些代码将展示它们如何管理资源和引用计数。这些代码不是任何特定标准库实现 2024-05-18 C++ #c++
C++调试:函数调用过程和堆栈 正文本文会讨论C++中函数的调用过程,以及堆栈、栈帧等调试信息。平台以及工具为 Apple Silicon M1 + lldb。 这将会从这个例子开始: 12345678910111213141516171819202122232425262728293031#include <stdio.h>#include <stdlib.h>#include <sys/ty 2024-05-17 经验方法 > C++ #c++
C++调试:内存管理 正文本文将会通过一个例子,通过 nm、lldb 工具查看 ELF 文件的内存管理: 123456789101112131415161718192021#include <iostream>using namespace std;/*说明:C++中不再区分初始化和未初始化的全局变量、静态变量的存储区,如果非要区分下述程序标注在了括号中*/int g_var = 0; // g_var 2024-05-16 经验方法 > C++ #c++ #lldb
C++并发:构建线程安全的队列 正文线程安全队列的完整的类定义,其中采用了条件变量: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include <condition_variable>#include <memory>#include < 2024-05-15 C++ #c++
C++并发:等待条件成立 一、用std::condition_variable等待处理数据伪代码如下: 123456789101112131415161718192021222324252627282930std::mutex mut;std::queue<data_chunk> data_queue; ⇽--- ①std::condition_variable data_cond;void dat 2024-05-15 C++ #c++
C++:并发保护 一、前言本文将会通过保护一个数据讨论:互斥锁、双重检查锁、 std::once_flag 类、 std::call_once() 函数、单例模式、使用局部静态变量实现单例模式等。 二、保护共享数据假设我们需要某个共享数据,而它创建起来开销不菲。因为创建它可能需要建立数据库连接或分配大量内存,所以等到必要时才真正着手创建。这种方式称为延迟初始化(lazy initialization),常见于 2024-05-14 C++ #c++
C++并发:锁 一、前言C++中的锁和同步原语的多样化选择使得程序员可以根据具体的线程和数据保护需求来选择最合适的工具。这些工具的正确使用可以大大提高程序的稳定性和性能,本文讨论了部分锁。 二、std::lock在C++中,std::lock 是一个用于一次性锁定两个或多个互斥量(mutexes)的函数,而且还保证不会发生死锁。这是通过采用一种称为“死锁避免算法”的技术来实现的,该技术能够保证多个互斥量按照一 2024-05-14 C++ #c++
C++:完美转发(二)(std::forward) 一、RVO优化和std::move、std::forward以下是一个综合性的例子: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 2024-05-12 C++ #c++