自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 收藏
  • 关注

原创 动态链接分析和总结

再假设module.c是一个共享模块的一部分,那么再-fPIC的作用下,产生的依然是跨模块的代码,因为编译器无法确定对global的引用时跨模块的还是模块内部的,而且即使时模块内部的,那么可执行文件还是可以对global进行引用,也会导致上面的问题,所以共享模块对global的应用都需要指向可执行文件中的副本。假设A.o和B.o依赖C.o;不过在现代的体系结构中,数据的相对寻址是没有 相对于当前指定地址(PC) 的寻址方式的,所以ELF用了一个巧妙地方式得到PC地址,然后再加上偏移量就得到数据地址了。

2023-02-09 13:26:03 953

原创 编译指定Python版本的boost python

默认安装boost的时候,没有指定Python版本,导致boost库里只有boost_python_27的版本。因为有需求使用python3,所以重新编译安装boost_python_37的版本。不然使用boost_python_37链接出来的库会提示python编译需要使用-fPIC。重新编译的时候覆盖安装到原来位置就可以了,然后需要对安装位置执行ldconfig。修改boost下的project-config.jam文件,添加如下代码。Python编译安装的时候需要选择-fPIC模式。

2023-02-02 20:35:08 1297

原创 可执行文件的装载

这边讨论了进程创建的一个大概的流程,主要是通过实验介绍了进程在创建的时候,是如何使用读取ELF文件的Segment信息的。还通过对《程序员自我修养》一书中的例子进行分析,详细分解了进程在加载Segment的时候是如何对物理页面的使用进行优化的。

2023-01-17 16:28:35 985 1

原创 静态链接过程分析

这边通过一系列的实验来分析了静态链接时链接器要做的主要的事情,其中重定位是链接过程中比较重要的过程。这边实验的平台使用的X64环境下的, 与书中的环境不太一致,所以导致readelf -r的输出的重定位类型不太一样,但基本结果还是服合预期的。

2023-01-16 02:28:05 584

原创 ELF文件格式解析

这边较为深入的介绍了ELF Header 、section Header 、以及secton的结构,并使用了《程序员的自我修养-链接、装载与库》这本书上的例子作为实验的内容,详细展现了目标文件中的这些信息应该如何解读。在知道了目标文件中的结构后,接下来的问题就是如何在链接的时候将他们组合起来,形成一个可执行文件或者是.so文件。

2023-01-13 17:06:23 1805

原创 ASIO IO_CONTEXT 源码整理

io_context中主要的代码流程还是简单的梳理了一下,如果不太看重各个位置实现的细节的话吗,io_context的代码还是稍微能看懂一点的,但如果要对细节也了如指掌的话,确实很有难度。尤其是关于operation申请内存和调用的位置确实没怎么懂;不过我这边整理得不是很好,都是看到哪里就整理到哪里,看起来会比较得乱。

2022-12-27 16:38:58 1013

原创 STL 源码阅读笔记-类型萃取(Traits)

trais这个技巧大量运用在STL中,它利用的是内嵌类型和编译器template参数推导等特性,实现对自定义数据和编译器内置数据的统一,同时带来的好处还有统一外部接口,降低代码冗余、提高运行时效率等等。《STL源码剖析》

2022-10-03 01:22:38 593

原创 STL源码阅读笔记-内存分配函数

在STL容器的构建中,一般会使用以下几个函数来对容器的初始内存进行构建,分别是。

2022-09-12 22:55:47 129

原创 STL源码阅读笔记-内存空间的分配和回收

不过在阅读书和源码的过程中都先忽略了多线程的情况,所以这边也先不考虑多线程的情况,后面看看有没有机会看看多线程中时如何实现的。SGI 在设计了双层的空间适配器,第一级配置器直接使用malloc和free进行内存的分配和回收。第二级配置器使用内存池的方式对内存对象进行管理,默认将128字节作为分割。大于128字节的内存直接由一级分配器进行分配,小于等于128字节的内存则在内存池内进行分配。通过__USE_MALLOC的宏定义可以决定是否开放第二级配置。...

2022-08-29 20:31:14 548

原创 STL源码阅读笔记-对象的构造与析构

STL 的 allocator 将几个操作都区分开来,内存申请由 alloc::allocatate() 负责,内存释放由alloc::deallocate()负责。对象的构造由::construct()负责,析构由::destory()负责。STL中负责对象构造和析构的全局函数定义在了 中,内容不多,才100行左右的代码。...

2022-08-28 00:39:25 180

原创 汇编函数调用原理

在程序中,函数调用是非常普遍的操作,那么C语言程序在函数调用的过程中,底层执行的汇编代码是怎么样的?寄存器和栈发生了哪些操作呢?

2022-04-09 17:23:32 3287

原创 Redis Cluster集群

简单记录学习Redis Cluter集群中的一些特性,包括数据分片 、主从切换、副本漂移、分片漂移。希望能够和各位读者多多交流!

2022-03-18 00:18:07 843

原创 Redis缓存击穿、缓存雪崩、缓存穿透、缓存预热

Redis缓存击穿、缓存雪崩、缓存穿透、缓存预热

2022-03-13 23:38:05 1451

原创 Redis - 哨兵机制与主从切换

Redis 哨兵简介哨兵(Sentinel)是一个分布式的系统,一个架构中可以运行多个哨兵进程,他们之间使用gossip protocols来进行通信,它为Redis提供了高可用的方案,主要是通过管理多个Redis服务器来完成以下三个任务。监控(Monitoring), 哨兵会定期检查主服务器和从服务器的运作是否正常。提醒(Notification), 某个Redis服务器出现问题的时候,会主动发出通知自动故障迁移(Automaticfailover),当监控的主服务器失效时,哨兵会进行自动故障迁

2022-03-08 23:25:45 3105 5

转载 如何停止/重启/启动redis服务

如果是用apt-get或者yum install安装的redis,可以直接通过下面的命令停止/启动/重启redis/etc/init.d/redis-server stop/etc/init.d/redis-server start/etc/init.d/redis-server restart如果是通过源码安装的redis,则可以通过redis的客户端程序redis-cli的shut...

2019-11-07 16:07:00 684

转载 MongoDB 数组操作(转)

$push:向文档数组中添加元素,如果没有该数组,则自动添加数组。db.users.insert({"name":"zhang"})db.users.update({"name":"zhang"},{"$push":{"emails":"zhang@pocketdigi.com"}})db.users.update({"name":"zhang"},{"$push":{"ema...

2019-09-26 10:43:24 343

原创 C++ 和 Python 的相互调用

C++调用 Python (Python官方提供的实现方式) 首先有一个Python函数def PythonFunc(number): return number + 10;我们期望在C++中使用的时候应该是类似下面这种int UsePythonFunction(int num){ int result; ///do somethin...

2019-09-24 17:23:06 323

原创 为YCM配置ycm_extra_conf.py脚本

配置完YouCompleteMe后启动Vim,在写c++代码的时候,偶尔会出现如no type name XXXX之类的问题。实际上还是~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py的flag数组没设置好。这个数组是有顺序要求的,因此调整设置顺序就可以正常运行了可以根据自己的环境单独进行调整...

2019-09-17 11:45:47 4069

原创 Linux 下 输入密码 闪一下 重新回到登入界面的 解决办法

在安装完某一个库后,重新启动系统的时候,突然发现输完密码闪了一下,回到登入的界面,起初第一次我没在意,但再次输入一遍密码后,却还是回到了登入的界面,这下我发现事情不对劲了。开始各种百度,谷歌。 得到的答案普遍是 因为修改了系统配置,更改了/etc/environment里面的设置,需要在命令行下进入然后修改配置文件,可是我打开一看,里面是空的,并没有什么设置,直接心态爆炸。然后就瞎搞了一...

2019-07-19 10:52:28 4895

转载 【转】php 没有php.ini配置文件

编译php的时候,已经指定了部分php参数了,这些参数可以通过phpinfo查看(或者php --ini)Configuration File (php.ini) Path /usr/local/php/lib phpinfo在 /usr/local/php/lib在源码中(没有到官网上下载相同版本的php源码)找一个php.ini-development或者php.ini-produ...

2019-07-16 17:00:35 294

转载 【转】 nginx报错502:connect() to unix:/var/run/php5-fpm.sock failed (2: No such file or directory)

一、背景早上突然发现服务器这边所有的请求都报错:502,具体报错信息如下:connect() to unix:/var/run/php5-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: xxx, server: xxx, request: "GET / HTTP/1.1"...

2019-07-16 16:59:01 2349

转载 【转】linux中给PHP安装mongodb的扩展

centos5.6 32bit  php 5.2.17  php安装路径 /usr/local/php  phpize路径 /usr/bin  php-config路径 /usr/bin  php.ini路径 /etc/  1.首先下载php的mongodb扩展  从http://pecl.php.net/package/mongo这个网址下载mongodb的扩展源码包...

2019-07-16 16:56:06 95

转载 【转】php5.6 php-fpm nginx安装和配置

今天发现有个网站是基于php版本的,然后上网收集资料后安装一遍试试。一、先安装php依赖包。yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glib...

2019-07-16 16:52:57 455

原创 Linux 下 vscode c++11的一些环境配置

VS code本身是一个编辑器,如果需要调试之类的功能需要自己安装一些插件,并且配置相关的json文件。linux 环境下,g++和clang都可以作为C++的编译器,我选择使用的是g++。首先是插件选择:(1)C/C++ 微软自带的C/C++插件。(2)C/C++ Clang Command Adapter:提供静态检测(Lint)(3)Code Runner:右键即可...

2019-07-07 20:51:05 5605

原创 c++ 中ref 和引用的区别

c++ 中 本身可以使用 & 来实现引用 ,那为什么还会出现ref 呢?ref:int f2(int &c){ c++; cout<<"in function c = " << c<<endl;}int main(){ int c = 10; f2(ref(c)); cout<<...

2019-07-06 21:25:51 7976 5

原创 自动推断模板返回值类型

在泛型编程中,常常会遇到一些问题,例如template <typename R,typename U,typename T>R add(U a,T b){ return (a + b);}int main(){ int a = 4; double b = 10.5; auto c = add<decltype(a + b)&gt...

2019-07-06 19:46:41 1162

原创 std::future 和 std:: promise

c++11中,有这两个类模板,std::future 和 std:: promise。这两个类的对象在获取值得时候需要相互配合。 std::future,其对象存储的值在未来一定会被改变。如果有线程在这个对象的值还没有改变的时候,通过调用std::future::get()来尝试获取该对象的值得话,那么这个线程就会被阻塞,直到对象的值被改变 std::promise,其对象...

2019-07-06 19:14:10 1408

原创 C++模板中 typename 和 class 的区别

template&lt;typename T&gt; 和 template&lt;class T&gt;一般情况下,这两个是通用的,也就是在一般情况下是typename 和 class是没有区别的,使用typename或者class只是编码风格的问题。但是,有一个情况例外,就是在遇到从属类型(dependent type)的时候,为了避免潜在的预防解析二义性,必须用typename...

2019-02-13 01:30:37 354

转载 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

转自:https://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到《Inside The C++ Object Model》这本书看了下, 感觉收获很大,因为书写得比较早,有些知识应该要更新,但是还是值得好好研读,由于该书的内容给人比较散的感觉,所以一直想找个时间整理一下,遂成此文,虽然都是抄书上的,但是却让我有了温故而知新的觉悟...

2019-02-12 19:54:41 135

原创 拷贝构造函数和赋值函数

 拷贝构造函数  如果构造函数第一个参数为自身类类型的引用,且任何额外参数都具有默认值,则此构造函数为拷贝构造函数。class A{ A(){ cout&lt;&lt;"default A constructor "&lt;&lt;endl; }; A(const A &amp; a):v(a.v){ cout&lt;&lt...

2019-02-12 17:52:42 323 1

原创 c++ operator操作符的两种用法:重载和隐式类型转换

C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换。对于操作符的重载,许多人都不陌生,但是对于第二种的自定义对象类型的隐式转换 ,估计不少人都不太熟悉。我们下面就用以下这个小例子展现一下这两种用法:#include&lt;string&gt;#include&lt;iostream&gt;#include&lt;cstdio&gt;#inclu...

2019-02-11 12:43:33 936

原创 new 和 malloc free 和 delete 的区别

在C++中,申请动态内存与释放动态内存用new/delete 与 malloc/free都可以,new/malloc申请动态内存,操作系统无法自动回收,需要对应的delete/free释放空间。那他们之间的区别在哪?区别1.malloc/free 是c语言中的库函数,需要头文件支持;而new/delete 是c++中的关键字2.使用new操作符时编译器会根据类型信息自行计算所需...

2019-02-10 01:05:56 2288

原创 剑指offer----整数中1出现的次数

首先假定我们现在需要找的是数字X在[1,n]中出现的次数这里我们先讨论 X∈[1,9]的情况我们可以跟容易的推出以下的规律:从1 到 10 ,在这些数字的个位(第0位)上,任意X都出现了 1次 从1 到 100 ,在这些数字的十位(第1位)上,任意X都出现了 10次 从1 到 1000,在这些数字的百位上(第2位),任意X都出现了 100次 以此类推,从1到  中, 在这些数字的...

2019-01-31 16:44:49 127

原创 剑指offer--数组中出现次数超过一半的数字

题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 解题思路     注意到目标数字在数组中个数超过一半,所以每次去掉数组中两个不同的数字,最后剩余下来的就是需要的目标数字,再将最后剩余下来的数字去原数组中判断出现的...

2019-01-30 15:05:19 111

原创 复杂链表的复制

题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)struct RandomListNode { int label; struct RandomListNode *next, *random; ...

2019-01-29 18:54:04 132

原创 MAC地址到IPV6地址的转换

EUI-48地址是用为IEEE 802或类IEEE 802网络设备的硬件地址,也就是MAC地址。EUI-48地址由一个24的组织唯一标识符(OUI)和 24位扩展标识符组成。 EUI-64 地址代表网络接口寻址的新标准。EUI-64标识符开始于一个24的组织唯一标识符(OUI),接着是一个由组织分配的40位扩展标识符 OUI的长度是24位,并占据EUI-48和EUI-64的...

2018-12-20 15:39:22 18513

原创 TCP 三次握手与四次挥手

 TCP 三次握手与四次挥手TCP运输连接的三个阶段:建立连接,数据传输,释放连接用三次握手建立连接用四次挥手释放连接seq(序号):TCP连接字节流中每一个字节都会有一个编号,而本字段的值指的是本报文段所发送数据部分第一个字节的序号。ack(确认号):表示期望收到的下一个报文段数据部分的第一个字节的编号,编号为ack-1及以前的字节已经收到。SYN:当本字段为1时,表示这...

2018-12-16 23:00:55 147

原创 路由算法

距离矢量路由算法(D-V)Distance vector routing:动态路由算法,最初应用于ARPANET,后来应用于因特网的RIP协议(路由信息协议) ,Cisco的IGRP和EIGRP路由协议也是采用DV这种路由算法的。基本思想每个结点通过测取与相邻结点的距离,再依据与其相邻结点交换的距离信息(度量可能采用跳数,时间延时等),间接地求出路由表,邻居之间相互交换信息1)各结...

2018-12-16 16:01:36 3904

原创 迭代器和指针的区别

迭代器与指针的差别:迭代器:      (1)迭代器不是指针,是类模板,表现的像指针。他只是模拟了指针的一些功能,通过重载了指针的一些操作符,-&gt;,*,++ --等封装了指针,是一个“可遍历STL( Standard Template Library)容器内全部或部分元素”的对象, 本质是封装了原生指针,是指针概念的一种提升(lift),提供了比指针更高级的行为,相当于一种智能指针,他...

2018-11-27 20:52:40 3863

原创 myeclipse 连接 Mysql 遇到的数据库的错误

1--Unknown initial character set index '255' received from server. Initial client character set can be mysql的连接错误,在网上查找到是编码不匹配的原因,但是确认了一遍没找到编码不是utf8的情况,在连接的URL后加上?useUnicode=true&amp;charact...

2018-11-01 13:37:43 1171

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除