- 博客(29)
- 收藏
- 关注
原创 静态链接过程发生了什么?
在静态链接过程中主要发生了两件事。一是空间与地址分配,链接器扫描所有输入文件的段,合并相似段并且重新计算段长度和在虚拟内存中的映射关系,收集所有的符号放到全局符号表中。二是符号解析与重定位,链接器收集所有的段信息和重定位信息并且进行符号解析和重定位、调整代码中的地址等。
2025-03-17 20:33:14
423
原创 FlatBuffers的结构和原理
FlatBuffers是一个跨平台的序列化库,支持C++, C#, C, Go, Java, Kotlin, JavaScript, Lobster, Lua, TypeScript, PHP, Python, Rust 和 Swift语言。通常我们可以用FlatBuffers在不同的平台保存和修改配置。
2025-02-20 09:33:35
830
原创 啥是目标文件?目标文件里面有什么?
从c++文件到二进制可执行文件主要经过预处理、编译、汇编和链接的过程,而在这些过程中参与到的文件类型主要有源文件、头文件、目标文件、静态库、动态库和可执行文件。下面表格对这些文件的生成过程和涉及到的步骤名称做个总结。从上面的编译过程我们可以看出目标文件在编译过程中扮演了一个非常重要的角色。我们在编译过程中只需要一条指令就能够直接从源码生成可执行文件,往往忽略了在其中产生重要作用的目标文件。如果想要搞懂编译的原理和程序运行的底层逻辑,目标文件是我们绕不过去的一道坎。
2025-02-15 22:44:44
362
原创 BIOS 如何确定引导扇区的位置
机械硬盘的信息都是存储在磁盘的表面,他们是由一圈一圈的磁道组成的。以前的磁盘的不同磁道的扇区数量是相同的,这就导致了很大的浪费,因为最外面的磁道的密度是最低的,信息是最安全的,所以最外面的磁道是0磁道。后来由于技术的改进,外面磁道的扇区数量就比里面扇区数量多,但是由于历史原因,最外面的磁道仍然是0磁道。在传统的硬盘驱动器中,一个扇区的大小是512字节,而现代的硬盘驱动器和固态硬盘通常采用4KB的大小。3、活动分区:MBR中的分区表记录了硬盘上的分区信息,包括每个分区的起始扇区和大小。
2023-10-03 17:47:26
827
原创 8086的寄存器及作用
FLAGS是16位的,其中包含了多个标志位,用于存储程序状态信息,例如进位标志、零标志、符号标志等。段寄存器:8086有4个段寄存器,分别是CS、DS、SS和ES。这些段寄存器都是16位的,用于存储内存段的基地址。其他:8086还有一些其他寄存器,例如IP寄存器(指令寄存器)、SI寄存器(源索引)、DI寄存器(目的索引)等。指针寄存器:8086有2个指针寄存器,分别是SP和BP。这些寄存器也是16位的,用于存储栈指针和基指针。8086是一种16位的cpu,它包含了多个寄存器,用于存储数据和程序状态。
2023-07-06 22:24:57
3302
原创 从开机开始
官方文档:https://clang-analyzer.llvm.org/checker_dev_manual.html。clang 可以用来做代码静态分析,用于排查bug。
2023-07-05 10:52:31
150
原创 clang 和 AST(语法树)
官方文档:https://clang-analyzer.llvm.org/checker_dev_manual.html。clang 可以用来做代码静态分析,用于排查bug。
2023-03-10 17:30:16
383
原创 从一个demo说elf文件
本文的demo是在linux环境下编译解析的,cpu是x86-64首先我们先写一个功能简单的demo-SimpleSection.c。这个demo中有一个函数用来打印数据,一个已经初始化的全局变量和未初始化的全局变量,一个已初始化的局部静态变量和一个未初始化的局部静态变量。下一步我们把代码文件编译成目标文件: 接着使用使用工具查看目标文件:从上述截图中可以看出,objdump得到的 目标文件信息共有8项,前六项0~5分别是:信息项共有5列,分别为Size、VMA、LMA、File off 和 Algn。
2022-12-04 15:29:17
363
原创 1.5. C++并发 (初始化保护,只需要保护一次)
在初始化时保护共享数据案例1. std::call_once使用,该案例中发送信息和接受信息都需要打开连接,但是这两个地方只需要调用一次打开连接即可。class X{private: connection_info connection_detail; connection_handle connection; std::once_flag connection_init_flag;...
2020-04-02 14:28:03
185
原创 1.4. C++并发(线程之间共享数据)
多线程之间共享数据经常会产生竞争条件,当竞争条件破坏不变量时会导致问题的产生。比如多个线程对同一数据的修改可能会导致未定义行为,多线程中某一行为需要获取多个锁时可能会造成死锁。解决竞争条件产生的问题的解决方案通常有两个,一个是修改数据结构的设计,被称为无锁编程,另一个是使用互斥元保护共享数据。案例1. 利用互斥元保护列表之简单实现#include <list>#include &...
2020-04-01 16:29:38
1140
2
原创 1.3. C++并发(转移线程所有权,简单控制线程数量)
std::thread实例是可以转移的,但是不能复制,因此转移线程的所有权也是很重要的内容点。案列1:转移线程所有权并且使用类进行线程管理(RAII)该实例类比前面1.2中提到的thread_guard类不同之处在于管理类不是引用thread实例而是将thread实例所有权转移到了类中。#include <thread>class scoped_thread{ std::t...
2020-03-30 13:21:39
473
原创 0. C++并发(并发的两种方式)
两种并发方式:进程和线程的区别a、进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)b、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。c、线程之间的通信...
2020-01-17 10:49:09
370
原创 1-2. C++并发(线程传参)
如何向线程内传递参数案例1:#include <thread>void f(int i, std::string const& s);std::thread t(f, 3, "hello");案例2:线程拷贝参数变量或引用参数变量#include <thread>void update_data_for_widget(widget_id w, wid...
2019-10-14 11:30:55
179
原创 1-1. C++并发(创建线程)
创建线程案例1:如何创建线程#include <thread>void do_some_work();std::thread my_thread1(do_some_work);//函数对象会复制到新线程的存储空间中,函数对象的执行和调用都在线程的内存空间中进行class background_task{public: void operator()() const ...
2019-10-14 10:48:35
198
原创 C++并发(期望)
在C++标准库中,有两种“期望”,使用两种类型模板实现,声明在头文件中:唯一期望(unique futures)(std::future<>)和共享期望(shared futures)(std::shared_future<>)案列1:使用std::future从异步任务中获取返回值#include <future>#include <iostrea...
2019-10-09 16:16:02
858
原创 C++并发(利用线程分割任务)
example: 利用线程来分割任务#include <iostream>#include <thread>#include<vector>#include <algorithm>#include <numeric>template<typename Iterator, typename T>struct ac...
2019-10-09 16:15:16
375
原创 C++并发(条件变量)
C++标准库对条件变量有两套实现:std::condition_variable和std::condition_variable_any,其中std::condition_variable_any的通用性更强,但是占用系统资源更多。首先介绍如何使用std::condition_variable:案例1:条件变量condition_variable的使用#include <mutex&g...
2019-10-09 14:06:31
243
原创 python 字典详解(真的超级详细)
字典在python中的地位想必不用作者多说了,下面直接进入正题。Python 2.7.8 (default, Jun 30 2014, 16:03:49) [MSC v.1500 32 bit (Intel)] on win32>>> dir(dict)['__class__', '__cmp__', '__contains__', '__delattr__', '__de...
2019-09-06 15:13:15
810
原创 Python大杀器--迭代器、生成器
要判断一个Pythonista编写的代码够不够pythonic,一个很重要的标准就是看他能不能灵活运用迭代器。首先要介绍一下什么是迭代器:在python中有两种循环语句,while和for。通常我们可以以c风格来使用它们,但是python额外提供了另外一种更为方便和高效的使用方式。通俗的来说就是边生产边消费。代码易读性和简洁高效性之争首先要介绍一下几个概念之间得差异:可迭代对象: 除了列...
2019-07-15 17:54:09
133
原创 python中的编码问题(python2和python3)
涉及的编码我们知道,计算机内部,所有信息最终都是一个二进制值。而编码就是我们日常索所能看到和理解的字符与二进制值之间的映射关系。上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码,一直沿用至今。但是,随着计算机的普及,其他国家也需要制定一套支持本国语言的映射关系,这边有了许许多多的编码规范。ASCII:八位二进制组合出256种状态...
2019-07-01 14:05:28
155
原创 json.load json.dump 和 json.loads json.dumps 全解析
在python编程中,我们经常要用到json对象作为数据交换格式。在json模块中提供了json.load、json.dump、json.loads和json.dumps这四个方法。其中json.dumps和json.loads为json的序列化和反序列化,而json.dump和json.load则是涉及文件操作的序列化存储和反序列化载。其中json.dump和json.dumps是以json....
2019-06-29 14:29:54
1672
原创 Elasticsearch 安装须知
什么是Elasticsearch?lasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库。然而,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容:一个分布式的实时文档存储,每个字段 可以被索引与搜索一个...
2019-03-20 22:35:29
113
原创 xmlrcplib 初探(学习python3 xmlrpc)
前言:刚到公司三个多月,由于项目中大量使用xmlrpc所以就系统的看了基于python的xmlrpclib模块的使用方法。xmlrpclib主要根据python版本的不同分为两个区别较大的版本,本文内容是关于基于python3版本的xmlrpclib。本文主要借助一些demo从server和client两个部分进行叙述。简介rpc:远程过程调用协议。简单的来说就是客户端可以很方便得远程调用服务...
2018-11-06 15:39:23
4168
原创 python ftplib 模块的使用
ftplib模块中定义了基于FTP协议的FTP类,可以进行一些FTP工作。以下是一些FTP接口的说明。class ftplib.FTP(host='', user='', passwd='', acct='', timeout=None, source_address=None)*参数方法host调用connect(host)方法user调用login(u...
2018-09-21 16:47:13
18027
翻译 c++ 多线程学习-thread库(3.1)单线程等待一个事件或者某个条件
当一个线程等待另一个线程完成任务时,有几种选择。 第一种,线程持续性的检查共享数据标志。但是这样会造成性能的浪费,而且重复性的访问势必会对数据进行长时间的上锁,从而造成其他线程无法访问,这样线程就会持续等待。 第二种,比第一种稍微好点,在线程等待时间内使用std::this_thread::sleep_for 进行周期性的间歇。但是在某些环境下会造成一些遗漏,例如一些高节奏游戏中很可能会造成丢...
2018-08-31 15:18:36
4647
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人