C++
文章平均质量分 56
Mr.LuoJ
打铁还需自身硬
展开
-
使用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 · 384 阅读 · 0 评论 -
CPP静态连接与符号修改
C++静态连接与符号修改原因在做API(或者叫SDk开发包)时,客户要求跨平台即支持windows;故引入了boost库在引入boost库后,客户开发环境就依赖boost库;有些开发者觉得依赖boost环境麻烦;引入boost库可能与客户已经使用的boost库版本不同;解决方法针对客户不需要依赖boost库环境,将boost库进行静态连接,并对外提供的头文件不包含boost相关头文件的引用;针对API与客户程序使用boost版本不同情况,linux下修改boost符号;静态连接编原创 2020-07-18 14:44:36 · 329 阅读 · 0 评论 -
对于新增Cpp虚函数的引起的偏移问题
概述C++类已定义的虚函数位置不能随意变动,一般建议在所有的虚函数末尾添加并且private属性也没有作用场景:如发布头文件与so给应用;之后在新发布的so中在原有头文件的虚函数A前面增加了一个虚函数B定义;应用如果直接使用新的so进行替换,不重新编译的情况下会造成虚函数偏移错位。即原应用调用的A的地方,会变成调用B;基类指针指向派生类;举例说明test.h#include <iostream>#include <string>class A{原创 2020-07-18 12:31:17 · 593 阅读 · 0 评论 -
私有继承
私有继承的 第一个规则:和公有继承相反,如果两个类之间的继承关系为私有,编译器一般不会将派生类对象转换成基类对象。 第二个规则: 从私有基类继承而来的成员都成为了派生类的私有成员,即使它们在基类中是保护或公有成员。私有继承的含义:私有继承意味着 “用…来实现”。 如果使类D私有继承于类B,这样做是因为你想利用类B中已经存在的某些代码,而不是因为类型B的对象和类型D的对象之间有什么概念上的关系。转载 2015-07-02 21:04:25 · 448 阅读 · 0 评论 -
*p=NULL与p=NULL见解
一个是给指针赋值,一个是给指针指向的数据赋值。例如:CHAR szText[32] = { "A"};CHAR *p = szText;*p = NULL; // 说明p指向的数据复制为NULL,也就是szText[0] = NULL;p = NULL; //说明p不指向任何变量原创 2015-05-27 10:30:05 · 3499 阅读 · 0 评论 -
__stdcall调用约定
DLL中调用约定和名称修饰(一) 调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用而建立的一种协议。这种协议规定了该语言的函数中的参数传送方式、参数是否可变和由谁来处理堆栈等问题。不同的语言定义了不同的调用约定。在C++中,为了允许操作符重载和函数重载,C++编译器往往按照某种规则改写每一个入口点的符号名,以便允许同一个名字(具有不同的参数类型或者是不同的作用域转载 2015-06-30 11:28:32 · 2278 阅读 · 0 评论 -
SGI STL第二级空间配置器空间释放函数deallocate
union obj{obj * free_list_link ;char client_data[1] ;};__default_alloc_template拥有配置器标准接口函数deallocate()。该函数首先判断区块大小,大于128bytes就调用第一级配置器,小于128bytes就找出相应的free list将区块回收://p is not 0/nullstatic原创 2014-12-11 19:15:21 · 749 阅读 · 0 评论 -
SGI STL 第二级空间配置器函数 allocate()
__default_alloc_template拥有配置器的标准接口函数allocate()。 此函数首先判断区块大小: 如果大于128bytes,就调用第一级配置器; 如果小于128bytes,就检查对应的free lists。 1.如果free list 之内有可用的区块,就直接拿来用; 2.如果没有,就原创 2014-12-11 18:48:08 · 704 阅读 · 0 评论 -
深度探索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 · 1124 阅读 · 0 评论 -
volatile问题
volatile的中文意思—-易变的。在C语言中,volatile是一个类型修饰符(type specifier),volatile修饰的变量是说这个变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。volatile变量主要用在以下几个方面:(1)并行设备的硬件寄存器(如状态寄存转载 2015-06-19 10:32:01 · 512 阅读 · 0 评论 -
线程池
一些定义threadpoolmacro.h#ifndef THREAD_POOL_MACRO_H_#define THREAD_POOL_MACRO_H_#define MAX_THREAD_NUM 256#define MIN_THREAD_NUM 1#include #include typedef void (*threadpool_task_fun_)(void*a原创 2015-05-29 22:30:48 · 419 阅读 · 0 评论 -
构造函数语意学----初始化列表
当你写下一个constructor时,就有机会设定class member的初值。要不是经由member initialization list,就是在constructor函数本体之内。 在下列情况下,为了让你的程序能够被顺利编译,你必须使用member initialization list: 1.当初始化一个reference member 时。 2.当初始化一原创 2014-11-16 16:51:16 · 557 阅读 · 0 评论 -
深度探索C++对象模型---data语意学
一个空的class如: //sizeof(X) ==1 class X{}; 事实上并不是空,它有一个隐藏的1byte大小,那是被编译器安插进去的一个char,这使得这一class的两个Object得以在内存中配置独一无二的地址: X a,b; if(&a == &b) cerr //sizeof原创 2014-11-19 15:46:12 · 491 阅读 · 0 评论 -
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 · 626 阅读 · 0 评论 -
主线程退出问题
主线程如果正常退出(即执行return返回),那么整个进程中所有的其他线程都会被清理; 如果主线程内执行ExitThread函数进行退出,那么主线程会执行退出,但是其他的线程不会被清理,而会一直执行到正常退出为止。 #include <iostream>#include <process.h>#include <Windows.h>using namespace std;UINT原创 2015-06-15 09:34:13 · 1019 阅读 · 0 评论 -
模板型别推导
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 · 266 阅读 · 0 评论 -
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 · 3026 阅读 · 0 评论 -
函数的可重入与线程安全
可重入 可重入的函数必须满足以下三个条件: (1)可以在执行的过程中可以被打断; (2)被打断之后,在该函数一次调用执行完之前,可以再次被调用(或进入,reentered)。 (3)再次调用执行完之后,被打断的上次调用可以继续恢复执行,并正确执行。 可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。不可重入(non-reentrant)函原创 2017-11-07 20:40:57 · 784 阅读 · 0 评论 -
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 · 444 阅读 · 0 评论 -
epoll事件机制简介
epoll简介 a) epoll是对poll的改进;是linux2.6下性能最好的多路I/O就绪通知方法。相对于select和poll来说,epoll更加灵活并且不存在描述符限制。epoll使用一个文件描述符对其他的描述符进行管理;将用户所感兴趣的事件到内核进行注册,因此只需从用户态到内核态的一次copy,这与select、poll不同。而select、poll每次调用都要传递用户所有监原创 2017-01-17 20:23:25 · 471 阅读 · 0 评论 -
关于C语言define宏定义字符串常量
问题由来: 本人一直以为宏对于字符串的处理也是直接在预处理时进行替换;但是最近在工作中遇到了字符串宏+1的情况;于是彻底的颠覆了以前的思维;于是乎进行测试验证得出以下结果。/*测试*/#include<stdio.h>#define LUOJIAN "luojian" int main() { printf("%s\n",LUOJIAN+1);原创 2017-01-08 14:43:50 · 38057 阅读 · 3 评论 -
二叉树的非递归遍历
#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 · 453 阅读 · 0 评论 -
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 · 667 阅读 · 0 评论 -
算法复习之基数排序
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 · 466 阅读 · 0 评论 -
Trie树、字典树
列表内容 我们来看看Trie树的特点:根节点为空值,剩下每一个节点保存一个字母。 如果从根节点遍历到某一个节点把路径节点的值连在一起就构成了一个字符串,利用这个特点很容易想到这棵树的第一个功能能帮我们查找某一个单词是否在树中(需要在每一个节点设置一个标志,表示从根节点到此节点是否存在一个单词);如果该单词存在,我们可以利用它实现第二个功能:去除重复单词;同样如果该词存,在我们还可以看原创 2015-07-30 11:57:29 · 402 阅读 · 0 评论 -
结构体字节对齐
在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。 内存对齐的原因: 1)某些平台只能在特定的地址处访问特定类型的数据转载 2015-06-12 14:27:46 · 405 阅读 · 0 评论 -
构造函数语意学----程序转化语意学
显式的初始化操作 已知这样的定义: X x0; 下面的三个定义,每一个都明显的以x0来初始化其class Object: void foo_bar(){ X x1(x0); X x2 = x0; X x3 = X(x0); //..... } 必要的程序转化有两个阶原创 2014-11-16 14:54:56 · 400 阅读 · 0 评论 -
深度探索C++对象模型--带有default constructor的Base class
如果每一个没有任何constructor的class派生自一个”带有default constructor“的Base class,那么这个derived class的default constructor 会被视为有用的constructor,并因此需要被合成出来。它将调用上一层Base class的default constructor(依据他们的声明顺序),对一个后继派生的class而言,这原创 2014-11-11 16:08:37 · 794 阅读 · 0 评论 -
socket阻塞与非阻塞,同步与异步
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。例如普通B/S模式(同步):提交请求->等待服务器处理->处理转载 2015-03-16 17:09:06 · 484 阅读 · 0 评论 -
同步与异步(二)
答案一:1.异步传输 通常,异步传输是以字符为传输单位,每个字符都要附加 1 位起始位和 1 位停止位,以标记一个字符的开始和结束,并以此实现数据传输同步。所谓异步传输是指字符与字符(一个字符结束到下一个字符开始)之间的时间间隔是可变的,并不需要严格地限制它们的时间关系。起始位对应于二进制值 0,以低电平表示,占用 1 位宽度。停止位对应于二进制值 1,以高电平表示,占用 1~2 位宽转载 2015-03-15 16:09:53 · 444 阅读 · 0 评论 -
同步与异步
同步执行模式: 所谓同步执行模式,是指语句在同步执行模式下,将始终保持对程序流的控制,直至 程序结束。如查询操作,客户机上的应用程序在向服务器发出查询操作的指令后,将 一直等待服务器将查询结果返回客户机端,然后才继续进行下一步操作。 众所周知,应用程序要从一个大表中删除所有的记录将是非常耗时的,如果应用程序 采用的是单线程(thread)同步执行方式,某次删除工作很可能耽误其转载 2015-03-15 16:09:54 · 366 阅读 · 0 评论 -
对象数组(Array of Objects)
数组的定义:Point knots[10] ;一般而言这是经由一个或多个runtime library函数达成的。在cfront中,我们使用一个被命名为vec_new()的函数,产生出以class objects构造而成的数组。比较新近的编译器,包括Borland、Microsoft和sun则是提供了两个函数,一个用来处理“没有virtual base class ”的class,另一个用原创 2015-01-21 12:51:33 · 2366 阅读 · 0 评论 -
new和delete运算符
运算符new的使用如下所示:int *pi = new int(5);但事实上它是由两个步骤完成的:1.配置内存://调用函数库中的new运算符int *pi = __new (sizeof(int));2.将配置得来的对象设置初值*pi = 5 ;更进一步地说,初始化操作应该在内存配置成功后才执行:int *pi ;if( pi = __new (原创 2015-01-21 20:40:01 · 621 阅读 · 0 评论 -
SGI STL空间配置与释放,std::alloc
C++的内存配置基本操作是::operator new(),内存释放的基本操作是::operator delete()。这两个全局函数相当于C的malloc()与free()函数。是的,SGI正是以malloc()与free()完成内存配置与释放。考虑到小型区块所可能造成的内存碎片问题,SGI设计了双层级配置器,第一级配置器直接使用malloc()和free(),第二级配置器则视情况而定采用不原创 2014-12-09 15:39:11 · 740 阅读 · 0 评论 -
深度探索C++对象模型------Data member的绑定
考虑下面的一段程序片段 //某个foo.h头文件,从某处含入 extern float x; //程序员的Point3D.h文件 class Point3D{ public : Point3D(float,float,float); //问题:被传回和被设定的x是哪一个x呢?原创 2014-11-17 11:02:15 · 437 阅读 · 0 评论 -
IP地址的三种表示格式及在Socket编程中的应用
使用TCP/IP协议进行网络应用开发的朋友首先要面对的就是对IP地址信息的处理。IP地址其实有三种不同的表示格式: 1)Ascii(网络点分字符串)- 2) 网络地址(32位无符号整形,网络字节序,大头) 3)主机地址 (主机字节序) IP地址是IP网络中数据传输的依据,它标识了IP网络中的一个连接,一台主机可以有多个转载 2015-03-16 17:07:46 · 441 阅读 · 0 评论 -
Linux的SOCKET编程详解
1. 网络中进程之间如何通信进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如UNIX BSD有:管道(pipe)、命名管道(named pipe)软中断信号(signal)UNIX system V有:消息(message)、共享存储区(shared memory转载 2015-03-16 17:10:55 · 360 阅读 · 0 评论 -
深度探索C++对象模型----data member的存取
Static Data Members 程序代码片段: class Point3d{ public: ..... private : float x; static List *freeList; float y;原创 2014-11-25 20:38:03 · 649 阅读 · 0 评论 -
深度探索C++对象模型---Data member的布局(Data member Layout)
已知下面一组data member: class Point3d{ public: ..... private : float x; static List *freeList; float y; static const原创 2014-11-20 11:15:54 · 533 阅读 · 0 评论 -
深度探索C++对象模型-----带有Default Constructor的member class object
implicitly default constructor 对于class X ,如果没有任何User-declared constructor,那么会有一个default constructor被隐式(implicitly)声明出来....一个被隐式声明出来的default constructor将是一个trivial(浅薄而无能,没啥用的)constructor.原创 2014-11-11 14:53:57 · 765 阅读 · 1 评论