- 博客(71)
- 资源 (9)
- 收藏
- 关注
原创 编译报错unable to initialize decompress status for section .debug_info
#编译报错unable to initialize decompress status for section .debug_info错误信息CXXLD tools/curve_keygen/usr/bin/ld: tools/curve_keygen.o: unable to initialize decompress status for section .debug_info/usr/bin/ld: tools/curve_keygen.o: unable to initialize d
2021-09-07 14:40:39 4462 1
原创 Centos7.6 编译prometheuscpp报can not find CURL/CURL_LIBRARY CURL_INCLUDE_DIR
Centos7.6 编译prometheuscpp报can not find CURL/CURL_LIBRARY CURL_INCLUDE_DIRCentos7.6 编译报can not find CURL/CURL_LIBRARY CURL_INCLUDE_DIR错误信息解决方法Centos7.6 编译报can not find CURL/CURL_LIBRARY CURL_INCLUDE_DIR错误信息cd ./source/;mkdir ./_build;cd ./_build;cmake ..
2021-09-07 14:35:53 655
原创 使用Visual Studio/VSCode 编译与调试linux
使用Visual Studio/VSCode 编译与调试linux Visual studio 2017/2019说明步骤VSCode说明步骤VSCode离线篇Visual studio 2017/2019说明Windows上做开发工作,通过该配置会将linux上服务/usr/include /usr/local/include的头文件拷贝至windows服务器下;(文件编码默认为非UTF-8,需自行修改编码)通过代码拷贝至linux上,并进行编译与调试;linux上需安装gcc,gdb,rsy
2021-02-02 09:15:27 379
原创 CPP静态连接与符号修改
C++静态连接与符号修改原因在做API(或者叫SDk开发包)时,客户要求跨平台即支持windows;故引入了boost库在引入boost库后,客户开发环境就依赖boost库;有些开发者觉得依赖boost环境麻烦;引入boost库可能与客户已经使用的boost库版本不同;解决方法针对客户不需要依赖boost库环境,将boost库进行静态连接,并对外提供的头文件不包含boost相关头文件的引用;针对API与客户程序使用boost版本不同情况,linux下修改boost符号;静态连接编
2020-07-18 14:44:36 321
原创 mysql为什么使用B+树、主从同步延时大、MVCC控制方法
mysql相关有一道MySQL的面试题,为什么MySQL的索引要使用B+树而不是其它树形结构?比如B树?B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;而B+树则只有叶子节点保存数据,进而降低了IO的次数从而节约时间;InnoDB数据页为16k,文件系统的页为4k,磁盘的扇区为512字节;B+树树高大概为1-2;假设key+page指针为14字节,
2020-07-18 14:00:09 197
原创 对于新增Cpp虚函数的引起的偏移问题
概述C++类已定义的虚函数位置不能随意变动,一般建议在所有的虚函数末尾添加并且private属性也没有作用场景:如发布头文件与so给应用;之后在新发布的so中在原有头文件的虚函数A前面增加了一个虚函数B定义;应用如果直接使用新的so进行替换,不重新编译的情况下会造成虚函数偏移错位。即原应用调用的A的地方,会变成调用B;基类指针指向派生类;举例说明test.h#include <iostream>#include <string>class A{
2020-07-18 12:31:17 584
原创 模板型别推导
ParamType是指针或者引用型别推导规则若表达式具有引用型别,先将引用部分忽略;对表达式的型别和param的型别执行模式匹配,来决定T的型别;param引用无const修饰template&lt;typename T&gt;void f(T&amp; param);int x = 1 ;const int cx = x ;const int&amp;...
2018-06-14 17:37:59 264
转载 Lamda C++11
转发:https://www.cnblogs.com/DswCnblog/p/5629165.html C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数。对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如C#,Python等。今天,我...
2018-04-21 14:06:31 3024
原创 函数的可重入与线程安全
可重入 可重入的函数必须满足以下三个条件: (1)可以在执行的过程中可以被打断; (2)被打断之后,在该函数一次调用执行完之前,可以再次被调用(或进入,reentered)。 (3)再次调用执行完之后,被打断的上次调用可以继续恢复执行,并正确执行。 可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。不可重入(non-reentrant)函
2017-11-07 20:40:57 782
原创 UDP数据包最大传输长度
以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的. 这个1500字节被称为链路层的MTU(最大传输单元). 但这并不是指链路层的长度被限制在1500字节,其实这这个MTU指的是链路层的数据区.并不包括链路层的首部和尾部的18个字节. 所以,事实上,这个1500字节就是网络层IP数据报的长度限制. 因为IP数据报的首部为20字节,所
2017-11-07 20:32:37 20831
转载 boost编译
转至:Boost在Linux和windows下的编译 32位 64位安装编译流程 运行命令:yum install gcc gcc-c++ bzip2 bzip2-devel bzip2-libs Python-devel -y 预先安装这些库,因为下面编译boost时会需要,若已安装,安装时会自动跳过,无需担心 定位到/home目录,运行命令:wget https://source
2017-11-07 20:28:46 437
原创 epoll事件机制简介
epoll简介 a) epoll是对poll的改进;是linux2.6下性能最好的多路I/O就绪通知方法。相对于select和poll来说,epoll更加灵活并且不存在描述符限制。epoll使用一个文件描述符对其他的描述符进行管理;将用户所感兴趣的事件到内核进行注册,因此只需从用户态到内核态的一次copy,这与select、poll不同。而select、poll每次调用都要传递用户所有监
2017-01-17 20:23:25 467
原创 poll事件机制
serv.c基本知识 poll的机制与select类似,与select在本质上没有多大差别;同样是轮询多个描述符,再根据描述符的状态进行处理;但是poll没有描述符数量的限制,这个与机器的上限有关;缺点与select类似即需要将大量的描述符从用户态复制至内核态;而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增加。函数 int poll(struct pollfd *
2017-01-17 12:03:38 4835
原创 select事件机制
1. 基本概念 IO 多路复用是指一旦发现进程指定的一个或者多个IO条件准备读,它就通知该进程;IO多路复用适合于如下场合: * 处理多个文件描述符 * 既有TCP监听套接字,又有已连接套接字 * 既有UDP,又有TCP * 同时处理多个协议 与多进程和多线程技术相比,IO多用复用技术的最大优势是系统开销小,系统不必对每个连接的创建进程或者线程处理。2. sele
2017-01-17 12:00:45 1964
原创 关于C语言define宏定义字符串常量
问题由来: 本人一直以为宏对于字符串的处理也是直接在预处理时进行替换;但是最近在工作中遇到了字符串宏+1的情况;于是彻底的颠覆了以前的思维;于是乎进行测试验证得出以下结果。/*测试*/#include<stdio.h>#define LUOJIAN "luojian" int main() { printf("%s\n",LUOJIAN+1);
2017-01-08 14:43:50 37984 3
转载 01背包问题
参考自:http://hi.baidu.com/acmgood/blog/item/53ca7237aaab32d5a3cc2bb4.html 题目 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品放入一
2015-07-30 16:04:53 664
原创 二叉树的非递归遍历
#include <iostream>#include <stack>using namespace std;typedef struct node{ int data ; //节点信息 struct node * leftChild ; //左孩子 struct node * rightChild ; //右孩子}BiTreeNo
2015-07-30 15:16:19 450
原创 Trie树、字典树
列表内容 我们来看看Trie树的特点:根节点为空值,剩下每一个节点保存一个字母。 如果从根节点遍历到某一个节点把路径节点的值连在一起就构成了一个字符串,利用这个特点很容易想到这棵树的第一个功能能帮我们查找某一个单词是否在树中(需要在每一个节点设置一个标志,表示从根节点到此节点是否存在一个单词);如果该单词存在,我们可以利用它实现第二个功能:去除重复单词;同样如果该词存,在我们还可以看
2015-07-30 11:57:29 400
原创 算法复习之基数排序
LSD:从低位排序逐步至高位排序,此处的低位指的是从个位->十位->百位…. 代码如下://获取数据d位的值int getDigit(int x,int d){ int value = 1 ; for(int i = 0 ;i <d-1;++i) value *= 10 ; return (x/value)%10;}//LSD 算法void lsd
2015-07-20 09:39:15 464
转载 使用两个栈实现堆
扩展:用两个队列实现一个栈?思路: 1.有两个队列q1和q2,先往q1内插入a,b,c,这做的都是栈的push操作。 2.现在要做pop操作,即要得到c,这时可以将q1中的a,b两个元素全部dequeue并存入q2中,这时q2中元素为a,b,对q1再做一次dequeue操作即可得到c。 3.如果继续做push操作,比如插入d,f,则把d,f插入到q2中, 4.此时若要做po
2015-07-10 17:56:02 1351
转载 判断链表中是否有环存在
思路: 用两个指针,pSlow,pFast,就是一个慢一个快 慢的一次跳一步, 快的一次跳两步, 什么时候快的追上慢的了就表示有环(pSlow == pFast )。 实现如下:struct listtype{ int data; struct listtype * next;}list;int find_cicle(list *head){ list *
2015-07-10 17:34:45 458
转载 逆序输出问题
一,题目 输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};二,分析解法一:把链表中链接结点的指针反转过来,改变链表的方向。然后就可以从头到尾输出了。参考 解法二:从头到尾遍历链表,每经过一个结点的时候,把该结点放到一个栈
2015-07-10 17:09:52 603
转载 删除单链表节点O(1)
一,题目给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:struct ListNode{int m_nKey;ListNode* m_pNext;};函数的声明如下: void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted); 二,分析 这是一道广为流传的Google面
2015-07-10 16:27:39 2835
原创 算法复习之两路归并排序
两路归并排序最差时间复杂度:O(nlogn) 平均时间复杂度:O(nlogn) 最差空间复杂度:O(n) 稳定性:稳定两路归并排序(Merge Sort),也就是我们常说的归并排序,也叫合并排序。它是建立在归并操作上的一种有效的排序算法,归并操作即将两个已经排序的序列合并成一个序列的操作。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 归并操作的基本步骤如下
2015-07-09 16:32:02 1902
原创 算法复习之堆排序
/**将两个元素进行交换*params *p ,*q待交换的两个元素的指针*/void swap(int *p,int *q){ int temp ; temp = *p ; *p = *q ; *q = temp ;}/**堆向下调整*list:堆的数组,hole:待调整的数据,len:待调整的堆的大小*/void HeapAdjust(int
2015-07-09 14:44:11 341
原创 算法复习之二分查找
#include<iostream>/**有序数组的二分法查询*list:有序的数组,len:数组的长度,key:查询的关键值*@return* -1:表示查询失败,其他数字:表示查询成功*/int binarySearch(int* list,int len ,int key){ int low = 0,high =len-1;//数组的两个“游标” int mid
2015-07-09 11:00:21 361
原创 算法复习之希尔排序
#include<iostream>void prin(int* list,int len){ for(int i = 0 ;i<len ;++len) std::cout<<list[i]<<" " <<std::endl;}/**希尔排序*list:待排序的数组,len:待排序数组的长度*时间复杂度:O(nlgn)* 希尔排序是按照不同步长对元素进行插
2015-07-09 10:18:51 362
原创 算法复习之插入排序
#include<iostream>void prin(int *list,int len){ for(int i= 0;i<len;++i) std::cout<<list[i]<<" "<<std::endl;}/************************************************************************//*
2015-07-08 22:55:52 372
原创 算法复习之选择排序
#include <iostream>//打印输出void prin(int *list ,int len ){ for(int i = 0 ;i<len;++i) std::cout<<list[i]<<" "<<std::endl;}/**选择排序*list : 待排序的数组,len:待排序数组的长度*时间复杂度:n^2,空间复杂度 O(1)*/voi
2015-07-08 21:52:21 311
原创 算法复习之快速排序
#include<iostream>int partition_1(int *list,int low,int high) { int privot = list[low] ;//分割点 while(low < high) { while( low < high && list[high] >= privot)//从high处寻找小于privot的值
2015-07-08 21:29:56 343
原创 算法复习之冒泡排序
#include <iostream>//打印输出void prin(int *list ,int len ){ for(int i = 0 ;i<len;++i) std::cout<<list[i]<<" "<<std::endl;}/**冒泡排序*list 数组,len数组的长度*/void bubbleSort(int *list,int len)
2015-07-08 21:07:05 398
原创 堆栈的理论知识
堆和栈的理论知识 1.申请方式栈:由系统自动分配和回收。 例如,声明在函数中的一个局部变量int b,系统自动在栈中为b开辟空间。堆:需要程序员自己申请,并指明大小,在C语言中用malloc等函数申请。 例如:p1 = (char*)malloc(10*sizeof(char)) ; 在C++中使用new运算符进行,但是注意p1,p2本身是在栈中的。
2015-07-08 14:16:25 517
原创 树的前序,中序,后序推理问题
某二叉树中序序列为ABCDEFG,后序序列为BDCAFGE,则前序序列是?1.由后序可知,E是整个二叉树的根。然后在中序里划分: ~~~~~~~E ~~~~~~/~\ ~ (BDCA) (FG) 2.由后序可知,A是左子树的根,然后在中序里ABCD判断A没有左子树: ~~~~~~E ~~~~~/~\ ~~~~A (FG) ~~~~~\ ~~~~(BD
2015-07-08 12:02:26 614
转载 Nagel算法
Nagel算法TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。Nagle算法的基本定义是任意时刻,最多只
2015-07-04 11:20:48 491
原创 TCP/IP三次握手和四次挥手
1、建立连接协议(三次握手)(1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。(3) 客户必须再次回应服务段一个ACK报文,这是报文段3。2、连接终止协议(四次挥手)
2015-07-03 16:05:45 373
转载 私有继承
私有继承的 第一个规则:和公有继承相反,如果两个类之间的继承关系为私有,编译器一般不会将派生类对象转换成基类对象。 第二个规则: 从私有基类继承而来的成员都成为了派生类的私有成员,即使它们在基类中是保护或公有成员。私有继承的含义:私有继承意味着 “用…来实现”。 如果使类D私有继承于类B,这样做是因为你想利用类B中已经存在的某些代码,而不是因为类型B的对象和类型D的对象之间有什么概念上的关系。
2015-07-02 21:04:25 446
转载 __stdcall调用约定
DLL中调用约定和名称修饰(一) 调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用而建立的一种协议。这种协议规定了该语言的函数中的参数传送方式、参数是否可变和由谁来处理堆栈等问题。不同的语言定义了不同的调用约定。在C++中,为了允许操作符重载和函数重载,C++编译器往往按照某种规则改写每一个入口点的符号名,以便允许同一个名字(具有不同的参数类型或者是不同的作用域
2015-06-30 11:28:32 2267
原创 SGI STL 第二级空间配置器 内存池
从内存池中取控件给free list 使用,是chunk_alloc的工作:template <bool __threads, int __inst>char*__default_alloc_template<__threads, __inst>::chunk_alloc(size_t __size, int& __nobjs)//待分配块的数量是引用{ char* __result
2015-06-25 14:53:14 621
原创 深度探索C++对象模型-指向Data Members的指针
class Point3d{ public: virtual ~Point3d(); //.... protected: static Pointed origin ; float x,y,z ;};每一个Point3d class object 含有三个坐标值,依序为x、y、z,以及一个vptr。至于satic da
2015-06-19 14:40:20 1121
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人