自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 vector资源释放

1. vector容器的内存自增长与其他容器不同,其内存空间只会增长,不会减小。先来看看"C++ Primer"中怎么说:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其...

2019-05-14 22:17:26 922

转载 share_ptr的线程安全性

shared_ptr线程安全性分析正如《STL源码剖析》所讲,“源码之前,了无秘密”。本文基于shared_ptr的源代码,提取了shared_ptr的类图和对象图,然后分析了shared_ptr如何保证文档所宣称的线程安全性。本文的分析基于boost 1.52版本,编译器是VC 2010。shared_ptr的线程安全性boost官方文档对shared_ptr线程安全性的正式表述是:...

2019-05-14 22:12:30 1208

原创 成员函数里memset(this,0,sizeof(*this))会发生什么

this里面可能包含string之类的对象,把这些对象清零会导致非法数据。即使一个类现在是POD,维护升级之后可能就不再是POD了。因此memset(this,0,sizeof(*this))是一种危险的写法。没有virtual function,没有vtable,同时class当中没有包含其他class成员的class可以用这个。 ...

2019-05-14 22:10:34 1218

转载 谈谈stl标准库的线程安全性

线程安全规则应用到标准 C++ 库中的所有类,这也包括 shared_ptr,如下所述。 有时提供更强的保证(例如,如下所述的标准 iostream 对象和专门用于多线程的类型,如 中的类型)。从多个线程读取某个对象时,该对象是线程安全的。例如,给定对象 A,可安全地同时从线程 1 和线程 2 读取 A。如果要通过某个线程写入到对象,则必须保护相同线程或其他线程上所有对该对象的读取和写...

2019-05-14 22:07:47 1489 1

原创 虚函数的内存结构,菱形继承的虚函数内存结构

https://blog.csdn.net/u010235142/article/details/78307022

2019-05-14 22:04:27 648

转载 子类不能继承父类的函数有哪些

但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。所以建议的方式是将析构函数声明为虚函数。也就是delete a的时候,也会执行派生类的析构函数。一个函数一旦声明为虚函数,那么不管你...

2019-05-14 22:01:56 5391

原创 C++中为什么用模板类

1:可用来创建动态增加或减少的数据结构2:它与某种特定类型无关,因此代码可重复使用3:它在编译时检查数据类型而不是运行时检查数据类型,保证了类型的安全4:它是平台无关的,具有很好的移植性...

2019-05-14 21:57:14 2106 1

原创 protected,public,private在继承中的可见性

在C++里,继承有三中方式,public、protected、private三中继承方式,我们需要记住这3种继承的可见性问题,会有两个可见性的问题,一是子类与父类的可见性,二是对象的可见性(具体更多是指对象与父类的成员可见性问题),我们必须记住,三种继承的方式都并不会影响子类成员对父类成员的访问权限,即:父类成员对子类成员的可见性是由父类自身决定的,三种继承的方式只会影响实例对象的访问可见...

2019-05-14 11:12:27 2631 1

转载 说一下C++的返回值优化

前言大家都知道“过早的优化是万恶之源”这句话,然而我相信其中的大多数人都不知道自己是不是在做过早的优化。我也无法准确的定义什么叫做“过早的优化”,但我相信这“过早的优化”要么是得不偿失的,要么干脆是有害无利的。今天我就想举个我认为是“过早的优化”的例子。从函数返回值为了从一个函数得到运行结果,常规的途径有两个:通过返回值和通过传入函数的引用或指针(当然还可以通过全局变量或成员变量,但我...

2019-05-14 11:03:41 552

转载 什么是回调函数,回调函数的使用场景

1.回调函数基本定义-什么是函数指针通俗来说,函数指针是一个指向特定函数的指针。函数的类型由其参数及返回类型共同决定,与函数具体名称无关。示例代码如下:int testFun1(int param1,long param2,float param3); //普通函数定义该函数的类型为int(int,long,float),该类型的函数指针可以定义为如下:int (*pTf)(in...

2019-05-13 21:42:10 2609

原创 如何区分一段代码是C++还是C代码编写的

C与C++在很多地方不同,比如1.最明显的是看输入输出:C用库函数printf()和scanf(),C++用标准流类cout和cin2.最本质的是看有无类class,这也是C++与C最根本的区别当然,有的程序表面上看是C++风格的,但用的是机构化的思想,而不是面向对象的思想。最明显的区别是头文件后面不用加.h,并且C++要有命名空间,而C却没有这个概念....

2019-05-13 21:26:05 7784

转载 标准库函数和系统调用的区别

写在前面:所谓标准库函数,这里暂时讨论C语言的标准库函数。库函数是语言本身的一部分,而系统函数是内核提供给应用程序的接口,属于系统的一部分。函数库调用是语言或应用程序的一部分,而系统调用是操作系统的一部分。一、标准库函数和系统调用的区别 函数库调用 系统调用 在所有的ANSI C编译器版本中,C库函数是相同的 各个操作系统的系统调用是不同...

2019-05-13 21:24:04 346

转载 如何定义一个只能在堆上创建的类,如何定义一个只能在栈上创建的类

1.如何定义一个只能在堆上生成的类方法一:首先我们要在堆上定义一个对象的时候一定要用new ,比如A *a=new A;C++会先在堆上malloc一块内存,然后执行构造函数。相信有些人看到这个题都会这样想:class A{public: A() { return new A; }};看到这里不要笑,...

2019-05-13 21:09:25 498

转载 C++4种类型转换

总 结  去const属性用const_cast。  基本类型转换用static_cast。  多态类之间的类型转换用daynamic_cast。  不同类型的指针类型转换用reinterpreter_cast。static_cast任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast;注:顶层const:表...

2019-05-13 20:59:00 160

转载 迭代器和普通自指针有什么区别

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

2019-05-13 16:00:19 878

转载 为什么需要虚继承,虚继承的实现原理

虚继承和虚函数是完全无相关的两个概念。虚继承是解决C++多重继承问题的一种手段,从不同途径继承来的同一基类,会在子类中存在多份拷贝。这将存在两个问题:其一,浪费存储空间;第二,存在二义性问题,通常可以将派生类对象的地址赋值给基类对象,实现的具体方式是,将基类指针指向继承类(继承类有基类的拷贝)中的基类对象的地址,但是多重继承可能存在一个基类的多份拷贝,这就出现了二义性。虚继承可以解决...

2019-05-12 21:07:54 2683

转载 析构函数可以是纯虚的么

C++中析构函数可以为纯虚函数吗?众所周知,在实现多态的过程中,一般将基类的析构函数设为virtual,以便在delete的时候能够多态的链式调用。那么析构函数是否可以设为纯虚呢?class CBase{ public: CBase() { printf("CBase()\n"); } virtual ...

2019-05-12 19:59:38 5624 1

转载 析构函数可以调用虚函数,构造函数为什么不可以调用虚函数

简要结论:1. 从语法上讲,调用完全没有问题。2. 但是从效果上看,往往不能达到需要的目的。Effective 的解释是:派生类对象构造期间进入基类的构造函数时,对象类型变成了基类类型,而不是派生类类型。同样,进入基类析构函数时,对象也是基类类型。所以,虚函数始终仅仅调用基类的虚函数(如果是基类调用虚函数),不能达到多态的效果,所以放在构造函数中是没有意义的,而且往往不...

2019-05-12 19:50:31 427

原创 内联函数、构造函数、静态成员函数可以是虚函数么

都不可以。1.内联函数需要在编译阶段展开,而虚函数是运行时动态绑定的,编译时无法展开; 2.构造函数在进行调用时还不存在父类和子类的概念,父类只会调用父类的构造函数,子类调用子类 的,因此不存在动态绑定的概念;3.静态成员函数是以类为单位的函数,与具体对象无关,虚函数是 与对象动态绑定的,因此是两个不冲突的概念;...

2019-05-12 19:40:07 2180

原创 为什么需要纯虚函数

通过它可以指明一个虚拟函数只是提供了一个可被子类型改写的接口。  纯虚函数是在基类中声明的虚函数,它可以在基类中有定义,而且派生类必须定义自己的实现方法。基类不能生成对象,可以使用指针或者引用派生类对象。基类不在基类中实现纯虚函数的方法是在函数原型后加“=0”  virtual void funtion1()=0引入原因/纯虚函数的作用 为了方便使用多态特性,我们常常需要在...

2019-05-12 19:25:00 4217

原创 为什么C++访问虚函数比访问普通函数慢

原因:1.- 运行时需要得到对应类的函数的地址2.- 当在用父类的引用或者指针调用虚函数时,会先从该对象的头部取到虚函数的地址(C++标准规定虚函数表地址必须放最前),再从虚函数表中取到实际要调用的函数的地址,最终调用该函数3.- 调用虚函数,相比普通函数,实际上多了三条指令:取虚表,取函数地址,call调用。4.- 影响cpu流水线5.- 编译器不能是内联函数6.- 仅当...

2019-05-12 19:16:09 763

转载 如何区分左值和右值

左值右值来自于c语言。左值:用来指代可以用在赋值表达式作则的东西,具体命名的对象、在内存中栈和堆上分配的对象,或者其他对象成员,总之就是有确定存储空间的东西。右值:指的是只能在赋值表达式右侧出现的东西,如字面值和临时对象。左值引用只能被绑定到左值,不能被绑定到右值:int a = 1;int &b = a;//正确,因为a是一个左值int &c = 5;//错误...

2019-05-12 19:13:12 711

转载 说说你使用的C++11的特性

auto1.在C++11之前,auto关键字用来指定存储期。在新标准中,它的功能变为类型推断。auto现在成了一个类型的占位符,通知编译器去根据初始化代码推断所声明变量的真实类型。各种作用域内声明变量都可以用到它。例如,名空间中,程序块中,或是for循环的初始化语句中。 1 2 3 autoi=42;// i is an...

2019-05-12 19:09:00 221

转载 介绍一下右值引用和移动语义和完美转发

这篇文章介绍的了第三章中右值引用相关的内容。在介绍该内容之前,会对一些相关问题进行解释,便于理解后面的内容。 并且,提前说明,许多编译器会多拷贝构造和移动构造进行优化省略,这样就看不到拷贝构造和移动构造的过程,需要在编译器选项中设置-fno-elide-constructors来关闭优化。指针成员和拷贝构造当一个类中含有指针成员时,由于默认的拷贝构造函数只会进行浅拷贝,所以当我们写出一下代...

2019-05-08 22:03:06 272

原创 char * const p ,char const * p,  char const * const p区别

const char *p; // 声明一个指向字符或字符串常量的指针(p所指向的内容不可修改)char const *p;// 同上,由于没有const *的运算,若出现const *的形式,则const实际上是修饰前面的,所以char const *p和const char *p一样。char* const p; //const修饰的是p,p不能修改。声明一个指向字符或字符串的指针...

2019-05-08 21:52:04 1552

转载 strtok函数在使用上要注意什么问题

一、函数的简介 函数原型:char *strtok(char *s, char *delim) 功能:作用于字符串s,以delim中的字符为分界符,将s切分成一个个子串;如果,s为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。 返回值:分隔符匹配到的第一个子串二、主要内容1、函数的作用...

2019-05-08 21:43:37 828

转载 用预处理指令声明一个常数,用以表明1年终有多少秒

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。意识到这个表达式将使一个16位机的整型数溢出-因此要用到长...

2019-05-06 22:51:18 793

原创 什么是序列化和反序列化

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化。序列化就是一种用来处理对象流的机制,所谓对象流也就是将...

2019-05-06 22:47:03 180

转载 函数调用类型_cedecl,_stdcall,_fastcall

简介:_cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。_stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈...

2019-05-06 22:44:19 452

转载 C++有哪些数据类型,为什么long和int都是4字节

如果你测试过long和int内置类型的大小,当发现都为4字节时,可能都会产生疑问,如果都是4字节,long并没有提供更大的存储范围,那么还要long做什么用?本文如下内容将为你解开这些疑团。先简要概述以下内置类型的发展,如有疏漏,还请指正。C语言开始时只有char(8位)和int(16位)两种,后来随着发展又加入了short(16位)和long(32位),此时,int可以是16位...

2019-05-06 22:39:43 1707

转载 如何使用C语言的面向对象

我们都知道,C++才是面向对象的语言,但是C语言是否能使用面向对象的功能?(1)继承性typedef struct _parent{int data_parent;}Parent;typedef struct _Child{struct _parent parent;int data_child;}Child;在设计C语言继承性的时候,我们需要做的就是把基础数据放在继...

2019-05-06 22:36:52 160

转载 C++ STL vector的实现机制

vector就是动态数组.它也是在堆中分配内存,元素连续存放,有保留内存,如果减少大小后,内存也不会释放.如果新值>当前大小时才会再分配内存.它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。这些都大...

2019-05-05 22:54:38 489

转载 何时编译器会自动生成拷贝构造函数

#include <iostream>using namespace std;class A{public: A() { cout << "1" << endl; } ~A() { cout << "2" << endl; }};class B : public A{public: B() ...

2019-05-05 16:11:58 1503 1

转载 何时编译器会自动生成默认构造函数

问题:对c++初学者来说存在一个误区,如果类没有定义任何构造函数,编译器会自动生成默认的构造函数。注意:这种说法是错误的。正确的说法:惟有默认构造函数”被需要“的时候编译器才会合成默认构造函数。那什么情况下是“被需要”的时候?以下有四种情况编译器会自动合成默认构造函数情况1含有类对象数据成员,该类对象类型有默认构造函数即:一个class含有类对象数据成员,该类对象类型...

2019-05-05 15:44:11 2155 1

转载 const和static能同时修饰成员函数吗

static的作用:对变量:1.局部变量:在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。 1)内存中的位置:静态存储区 2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化) 3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。注:当static用来修饰局部变量的时...

2019-05-05 15:10:58 3730 1

转载 strcpy和memcpy使用时的注意事项,strncpy、memncpy的区别

本文参考《C标准库》编写。一、函数说明1、memcpy函数void*memcpy(void *s1, const void *s2, size_t n);说明:函数memcpy从s2指向的对象中复制n个字符到s1指向的对象中。如果复制发生在两个重叠的对象中,则这种行为未定义。返回值:函数memcpy返回s1的值。2、strcpy函数char*st...

2019-05-05 14:54:23 5625 1

转载 请简述Windows内存管理的方式

windows 内存管理方式主要分为:页式管理,段式管理,段页式管理。页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页;页式管理把内存空间按照页的大小划分成片或者页面,然后把页式虚拟地址与内存地址建立一一对应的页表;并用相应的硬件地址变换机构来解决离散地址变换问题。页式管理采用请求调页或预调页技术来实现内外存存储器的统一管理。其优点是没有外碎片,每个内碎片不超过页的大小。缺点是,...

2019-05-05 14:41:16 438

原创 智能指针可以放到容器中么

在C++标准中,一个STL对象是可以“拷贝构造”和“赋值”,而且当一个源对象复制到目标对象后 ,源对象的状态通常是不会改变的。但是,这不适用于auto_ptr(智能指针)。因为一个auto_ptr对象拷贝或赋值到另一个对象时会使源对象产生预期变动之外的变化。比如说下面的代码:class Foo{};std::vector < std::auto_ptr <Fo...

2019-05-05 14:17:37 2604

空空如也

空空如也

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

TA关注的人

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