![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
CL_XYZ
这个作者很懒,什么都没留下…
展开
-
bind使用在shared_ptr上的细节
一句话总结,bind在把函数绑定到function上的时候,会让function持有一份传递的实参的拷贝,如果实参恰好是shared_ptr那就会让shared_ptr所指的对象生命期不会短于function。#include <iostream>#include <functional>#include<memory>#include<fu...原创 2019-03-17 13:37:00 · 1321 阅读 · 0 评论 -
C中的强符号与弱符号
作用域c语言的作用域有两种,代码块作用域和文件作用域。代码块作用域是指由花括号限定的作用域,花括号以外的作用域就是文件作用域。这里指的花括号可以是函数的花括号,if,while,for,namespace的花括号,遵循的基本规则是花括号以里可以看到本花括号以外的东西,但是相反则不可以。int main(){ int y=4; { int x=3; ...原创 2019-04-27 16:14:10 · 901 阅读 · 0 评论 -
C++智能指针自定义删除器
智能指针支持用户自定义删除方法,默认为delete或者delete[],不过当我们用一个裸指针定义一个智能指针,而裸指针指向的内存是malloc出来的时候,显然用delete删除会出问题,比如。struct A{ int a,b; int*p; A() { p=(int*)malloc(sizeof(int)); } ~A() { free(p); }};int...原创 2019-04-04 10:53:24 · 2840 阅读 · 4 评论 -
auto_ptr和unique_ptr
auto_ptr是老版本的智能指针,当时还没有unique_ptr,shared_ptr,weak_ptr,现在auto_ptr已经被废弃,他有了更好用的替代品unique_ptr,相对于他的后继者,它有以下几个缺点。1.auto_ptr可以进行赋值和拷贝运算,但是他虽然名义上做的是赋值和拷贝,但是背后做的却是move语义做的事情,拷贝和赋值之后,源对象被置位空,这看起来十分反常。而uniqu...原创 2019-04-04 12:11:37 · 811 阅读 · 0 评论 -
从汇编语言角度辨析char*str="abc"和char str[]="abc"
所以说想要从根本上理解这种语言上的trick就要直接看他的汇编代码,对着经验和现象猜来猜去就如同盲人摸象。 char*str="abc";01092BFE mov dword ptr [str],109CC70h char strr[]="abc";01092C05 mov eax,dword ptr ds:[0109CC70h] ...原创 2019-04-10 20:07:15 · 1742 阅读 · 0 评论 -
再探C++中的常量
什么是常量?相信绝大多数写过程序的人见到这两个字的第一反应就是——不能更改的量。没问题,书本上这样告诉我们,编译器也这样告诉我们,好像常量就真的是那么简单,纯粹,让人心安理得的去使用它,不需要任何顾虑。但事实并没有想象中的那么单纯。1.常量并不一定是常量int main(){ const int x=3;}这是一个“假常量”,当我们在下边敲出 x=4; 这样的代码时,编译...原创 2019-04-10 21:23:52 · 1345 阅读 · 0 评论 -
从汇编语言角度剖析右值引用和左值引用的本质
右值引用着实让人很挠头,而他又很重要,看多了“右值是短暂的,左值是持久的”这种正确但是让人摸不到头脑的话,我觉得很有必要从右值引用和左值引用实现的层面进行一次区分。首先明确一点,左值引用和右值引用,都是指针。其实说白了他们都是编译器给我们提供的“功能”,也就是说,编译器在我们看不到的地方做了很多别的事情,让一个指针的用法变得如此丰富多彩。但是不管多么丰富多彩,他也只是一个指针而已。先来...原创 2019-04-05 10:53:01 · 1644 阅读 · 1 评论 -
tinyhttpd源码剖析
这是一个简单的服务器程序,只有五百多行。每次来一个请求就开一个线程去处理它,可以解析POST,GET而且可以执行CGI程序。服务器程序想要把自己收到的参数传给某些别的程序去执行,并且把这些程序产生的输出拿走,发给某个目标对象。CGI所处的位置就在“服务器把收到的参数传给别的程序”这个环节。它规定了一个标准的借口,我们只需要调用setenv()把收到的东西设置成条件变量,然后再通过execl执行...原创 2019-04-04 20:58:24 · 743 阅读 · 0 评论 -
源码角度看memset初始化数组
memset经常被用来做初始化,memset(ptr,0,sizeof ptr)初始化为0,memset(ptr,-1,sizeof ptr)初始化为-1,除此以外的值很少用到,原因看memset的源码。void* memset(void* s,int c,size_t n){ const unsigned char uc=c; unsigned char* sc; ...原创 2019-03-23 19:37:23 · 242 阅读 · 0 评论 -
shared_from_this的使用
当你想使用一个类的某个成员函数返回指向这个类的指针的时候,可以这样写class A{public: A(int y=0):x(y){ } A* getthis() { return this; } int x;};int main (void) { A a; cout<<a.x<<endl; A*p=a.getthis(); p->...原创 2019-04-04 12:51:51 · 6750 阅读 · 0 评论 -
简述STL之萃取器
萃取器相当于对迭代器的功能扩展,有了它让我们得以通过迭代器获得迭代器所指的数据的类型。现在假设我们要实现一个算法,它接受一个迭代器作为参数,算法中需要定义一个变量,类型为迭代器所指的数据的类型。对于这个问题,我们并没有什么好办法,C++没有typeof()这种东西,typeid()也只能获得关于类型的信息,并不能用来声明变量。不过我们还是可以仰仗function templete的参数...原创 2019-03-23 16:39:35 · 785 阅读 · 0 评论 -
C++中的using关键字
罗列一下using的几种用法1.using namespace 这是最常见的用法,C++用命名空间把各种函数名字变量名字类名字保护起来。2.在子类里使用父类的private成员class A{public: int v;};class B: A{public: using A::v; void fun() { cout<<v<<end...原创 2019-04-03 21:30:49 · 2581 阅读 · 1 评论 -
菱形继承下的虚函数表指针
本文基于VS2012编译器,不同的编译器结果可能有较大出入来看这样一段代码class A{ };class C:virtual public A{ };class B:virtual public A{ };class D:public C,public B{ };int main (){ cout<<sizeof(A)<<endl; cou...原创 2019-03-22 21:00:39 · 758 阅读 · 0 评论 -
C++对象中成员的绑定规则
先来看一段代码extern float x;class Point3d{public: Point3d(float,float,float); float X() const { return X; } void X(float new_x ) const { x=new_x; }private: float x,y,z;};现在如果有人问,X(...原创 2019-03-22 16:28:25 · 424 阅读 · 0 评论 -
C++多态用派生类指针调用基类虚函数
多态的使用方法是当基类指针指向派生类对象时,可以直接调用派生类重写的虚函数,而不是基类的虚函数。实现方法也是老生常谈,通过每个对象中的虚函数表指针,去找属于自己类的虚函数执行。那如果用派生类指针指向基类然后调用虚函数呢?#include<iostream>#include<vector>using namespace std;class A{public:...原创 2019-03-21 11:21:50 · 6966 阅读 · 1 评论 -
剖析函数传递参数选择引用或值的区别
如果对ESP,EBP,栈帧等概念比较陌生,推荐先去了解一下函数调用的过程。推荐使用OD+VS自己实现一遍加深印象。(OD用来查看内存,VS用来看汇编代码和源代码的对应情况)mov与lea的区别指令:mov 操作对象:变量 有无[]没有区别,都是取值指令:mov 操作对象:寄存器 有[]表示取地址,没有[]表示取值指令:lea 操作对象:变量...原创 2019-05-04 18:57:48 · 525 阅读 · 0 评论