- 博客(40)
- 问答 (1)
- 收藏
- 关注
原创 细说new与malloc的10点区别
前言几个星期前去面试C++研发的实习岗位,面试官问了个问题: new与malloc有什么区别?这是个老生常谈的问题。当时我回答new从自由存储区上分配内存,malloc从堆上分配内存;new/delete会调用构造函数/析构函数对对象进行初始化与销毁;operator new/delete可以进行重载;然后强行分析了一下自由存储区与堆的区别。回来后感觉这个问题其实回答得不怎么好,因为关于new
2016-01-19 10:58:07
349
原创 [置顶]C++ 异常机制分析
C++异常机制概述异常处理是C++的一项语言机制,用于在程序中处理异常事件。异常事件在C++中表示为异常对象。异常事件发生时,程序使用throw关键字抛出异常表达式,抛出点称为异常出现点,由操作系统为程序设置当前异常对象,然后执行程序的当前异常处理代码块,在包含了异常出现点的最内层的try块,依次匹配catch语句中的异常对象(只进行类型匹配,catch参数有时在catch语句中并不会使用到)。
2016-01-18 16:52:15
504
原创 [置顶]C++对象模型详解
前言文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局、虚表指针、虚基类指针等有深入了解的朋友可以慢慢看。本文的结论都在VS2013上得到验证。不同的编译器在内存布局的细节上可能有所不同。文章如果有解释不清、解释不通或疏漏的地方,恳请指出。何为C++对象模型?引用《深度探索C++对象模型》这本书中的话:有两个概念可以解释C++对象模型:语言中直接支持面向对象程序设计的
2016-01-18 16:52:11
555
原创 [置顶]C++ 引用计数技术及智能指针的简单实现
一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧)。最近花了点时间认真看了智能指针,特地来写这篇文章。智能指针是什么简单来说,智能指针是一个类,它对普通指针进行封装,使智能指针类对象具有普通指针类型一样的操作。具体而言,复制对象时,副本和原对象都指向同一存储区域,如果通过一个副本改变其所指的值,则通过另一对象访问的值也会改变.所不同的是,智能指针能够对
2016-01-18 16:52:07
390
原创 [置顶]浅谈 GPU图形渲染管线
图形渲染管道被认为是实时图形渲染的核心,简称为管道。管道的主要功能是由给定的虚拟摄像机、三维物体、灯源、光照模型、纹理贴图或其他来产生或渲染一个二维图像。由此可见,渲染管线了实时渲染技术的底层工具。图像中物体的位置及形状是通过它们的几何描述、环境特征、以及该环境中虚拟摄像机的摆放位置来决定的。物体的外观受到了材质属性、灯源、贴图以及渲染模式(sharding modles)的影响。
2016-01-18 16:52:02
670
原创 C++编译期多态与运行期多态
前言今日的C++不再是个单纯的“带类的C”语言,它已经发展成为一个多种次语言所组成的语言集合,其中泛型编程与基于它的STL是C++发展中最为出彩的那部分。在面向对象C++编程中,多态是OO三大特性之一,这种多态称为运行期多态,也称为动态多态;在泛型编程中,多态基于template(模板)的具现化与函数的重载解析,这种多态在编译期进行,因此称为编译期多态或静态多态。在本文中,我们将了解:什么是
2016-01-18 16:51:53
452
原创 关于传值与传引用的讨论
效率问题对于用户自定义的类型来说,传引用一般要比传值高效。传引用不需要经过对象过程,在《Effective C++》中作者举了个例子:class Base{ pubilc: Base(); ~Base(); private: std::string b1; std
2016-01-18 16:51:47
372
原创 智能指针小分析
我们为什么需要智能指针所谓资源就是,一旦用了它,将来必须还给系统。C++中内存资源的动态分配经由new与delete实现。问题在于,无论是有意无意,我们有时候总会忘记释放内存中的资源。例如delete语句出现在某个循环语句中,而我们的continue或者break却跳过了它的执行;或者是在程序中某个分支含有函数return语句,而delete操作放在return 语句之后;更加难以预料的事情是程
2016-01-18 16:51:39
316
原创 GC基本算法及C++GC机制
前言垃圾收集器是一种动态存储分配器,它自动释放程序不再需要的已分配的块,这些块也称为垃圾。在程序员看来,垃圾就是不再被引用的对象。自动回收垃圾的过程则称为垃圾收集(garbage collection)。在一个支持垃圾收集的语言中,程序显式地申请内存,但从不需要显式的释放它们。垃圾收集器会定期识别垃圾块,并将垃圾块放回空闲链表中。显然,C语言的malloc包不是一个带GC功能的分配器,程序员显式
2016-01-18 16:51:33
2543
原创 C++ 自由存储区是否等价于堆?
“free store” VS “heap”当我问你C++的内存布局时,你大概会回答:“在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区”。如果我接着问你自由存储区与堆有什么区别,你或许这样回答:“malloc在堆上分配的内存块,使用free释放内存,而new所申请的内存则是在自由存储区上,使用delete来释放。”这样听起来似乎也没错,但如果
2016-01-18 16:51:27
306
原创 非常规手法求1+2+…+n的值。
一般文章的开头是最难写的,写点“前言”吧,又显得太正经;写些废话吧,又好像是在凑字数,没多大意思。不过您已经看到这里来了,说明这段话还是有存在的意义的(●ˇ∀ˇ●)其实刚开始看见这个题目我是拒绝的,它让我想起了“求++(i++)++..”这种无聊的考试题目。一阵苦思无果后,我决定看看“参考答案”,不看不要紧,我已经被答案给惊艳了(原谅我思维狭隘见识少)。如果看过这道题目的朋友可以直接关闭网页,
2016-01-18 16:51:18
635
原创 QT信号槽机制
信号槽信号槽是QT中用于对象间通信的一种机制,也是QT的核心机制。在GUI编程中,我们经常需要在改变一个组件的同时,通知另一个组件做出响应。例如:一开始我们的Find按钮是未激活的,用户输入要查找的内容后,查找按钮就被激活,这就是输入框与Find按钮这两个组件间通信的例子。早期,对象间的通信采用回调来实现。回调实际上是利用函数指针来实现,当我们希望某件事发生时处理函数能够获得通知,就需要
2016-01-18 16:51:12
360
原创 C++11特性:decltype关键字
decltype简介我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行。RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应type_info数据,通过name成员函数返回类型的名称。同时在C++11中typeid还提供了hash_code这个成员函数,用于返回类型的唯一哈希值。RTTI会导致运行时效率降低,且在泛型编程中,我
2016-01-18 16:51:06
408
原创 C++11特性:auto关键字
前言本文的内容已经不新鲜了。关于auto,翻来覆去被人知道的都是这些东西,本文并没有提出新颖的auto用法。本人原是痛恨博客一篇篇都是copy而来缺乏新意的探索,当然,本文不是copy而来,但发布这样一篇大家皆知的文章心里甚是惶恐。本文对auto的内容加以整理,权当是自己的复习笔记了。C++98 auto早在C++98标准中就存在了auto关键字,那时的auto用于声明变量为自动变量,自
2016-01-18 16:51:01
338
原创 【C++实现python字符串函数库】strip、lstrip、rstrip方法
【C++实现python字符串函数库】strip、lstrip、rstrip方法这三个方法用于删除字符串首尾处指定的字符,默认删除空白符(包括'\n', '\r', '\t', ' ')。s.strip(rm) 删除s字符串中开头、结尾处,位于 rm删除序列的字符s.lstrip(rm) 删除s字符串中开头处,位于 rm删除序列的字符s.rstrip(rm) 删除s字符串中结尾处
2016-01-18 16:50:51
866
原创 【C++实现python字符串函数库】二:字符串匹配函数startswith与endswith
【C++实现python字符串函数库】字符串匹配函数startswith与endswith这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值。startswith()函数判断文本的指定范围字符段是否以某个字符开始,endswith()函数判断文本是否以某个字符结束。默认的指定范围为整个字符串:>>> >>> a'abcdefghijklmn'>>> a.s
2016-01-18 16:50:45
485
原创 【C++实现python字符串函数库】一:分割函数:split、rsplit
【C++实现python字符串函数库】split()与rsplit()方法前言本系列文章将介绍python提供的字符串函数,并尝试使用C++来实现这些函数。这些C++函数在这里做单独的分析,最后我们将把这些函数放在命名空间中,真正作为一个函数库来使用。本节内容在本节,我们将实现两个python字符串分割函数。这两个函数的函数原型为:split(spe = None,maxsplit=
2016-01-18 16:50:39
558
原创 python 列表与元组的操作简介
上一篇:Python 序列通用操作介绍列表列表是可变的(mutable)——可以改变列表的内容,这不同于字符串和元组,字符串和元组都是不可变的。接下来讨论一下列表所提供的方法。list函数可以使用list函数来创建列表:list('Hello')['H', 'e', 'l', 'l', 'o']列表的基本操作在Python 序列通用操作介绍中提及的操作全部适用于列表,
2016-01-18 16:50:31
388
原创 Python 序列通用操作介绍
上一篇:python字符串基础一下一篇:Python 列表操作简介序列概览Python包含6种内置的序列:列表、元组、字符串 、Unicode字符串、buffer对象、xrange对象。在序列中的每个元素都有自己的编号。列表与元组的区别在于,列表是可以修改,而组元不可修改。理论上几乎所有情况下元组都可以用列表来代替。有个例外是但元组作为字典的键时,在这种情况下,因为键不可修改,所以就不能使用
2016-01-18 16:50:25
341
原创 Python字符串基础一
下一篇:Python 序列通用操作介绍写在前面下学期开始上计算机网络的课程,现在已经在看相关书籍,希望结合python写出一个网络爬虫程序。利用学习C++后的空余时间来看看Python并在这里总结、记录,就权当是我的备忘录吧。字符串Unicode字符串在Python2中,普通字符串是以8位ASCII码进行存储的,而Unicode字符串则存储为16位unicode字符串,这样能够表示更
2016-01-18 16:50:21
334
原创 【unity shaders】一 Unity中的Shader及其基本框架
shader和Material的基本关系Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)。之后,我们
2016-01-18 16:50:14
368
原创 编译器角度看C++复制构造函数
[C++对象模型]复制构造函数的建构操作关于复制构造函数的简单介绍,可以看我以前写过的一篇文章C++复制控制之复制构造函数该文章中介绍了复制构造函数的定义、调用时机、也对编译器合成的复制构造函数行为做了简单说明。本文因需要会涉及到上文的一些知识点,但还是推荐先阅读上文。本文主要从编译器角度对复制构造函数进行分析,纠正以前对复制构造函数的一些错误认识。浅拷贝(deep copy)与深拷贝(sh
2016-01-18 16:50:04
257
原创 C++ 合成默认构造函数的真相
对于C++默认构造函数,我曾经有两点误解:类如果没有定义任何的构造函数,那么编译器(一定会!)将为类定义一个合成的默认构造函数。合成默认构造函数会初始化类中所有的数据成员。 第一个误解来自于我学习C++的第一本书 《C++ Primer》,在书中392页:“只有当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数”。实际上这句话也没有说错,它说明了默认构造函数定
2016-01-18 16:49:58
289
原创 C++内联函数
在C语言中,我们使用宏定义函数这种借助编译器的优化技术来减少程序的执行时间,那么在C++中有没有相同的技术或者更好的实现方法呢?答案是有的,那就是内联函数。内联函数作为编译器优化手段的一种技术,在降低运行时间上非常有用。我们将从:什么是内联函数为什么要使用内联函数内联函数优缺点分析何时使用内联函数 这四个方面对内联函数进行介绍。 什么是内联函数
2016-01-18 16:49:50
245
原创 C++ 序列式容器之vector
什么是容器 容器,顾名思义,是用来容放东西的场所。C++容器容放某种数据结构,以利于对数据的搜寻或排序或其他特殊目的。众所周知,常用的数据结构不外乎:数组array, 链表list, 树tree, 栈stack, 队列queue, 散列表hash table, 集合set、映射表map 等等。容器便是容纳这些数据结构的。这些数据结构分为序列式与关联式两种,故容器也
2016-01-18 16:49:44
294
原创 二叉查找树 C++实现(含完整代码)
一般二叉树的查找是通过遍历整棵二叉树实现,效率较低。二叉查找树是一种特殊的二叉树,可以提高查找的效率。二叉查找树又称为二叉排序树或二叉搜索树。 二叉查找树的定义 二叉排序树(Binary Search Tree)又称二叉排序树(Binary Sort Tree),或者是一颗空二叉树,或者是具有一下特性的二叉树: 若它的左子树不为空
2016-01-18 16:49:38
1398
原创 C++强制类型转换操作符 dynamic_cast
dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用。 >>>>>>>>>>>编译器的RTTI设置>>>>>>>>>>>dynamic_cast提供RTTI(Run-Time Type Information),也就是运行时类型识别。它对编译器有要求,需要编译器启动“运行时类型信息”这一选项。当编译器不开启RTTI时,运行含有dynamic_cas
2016-01-18 16:49:29
401
原创 C++强制类型转换操作符 const_cast
const_cast也是一个强制类型转换操作符。《C++ Primer》中是这样描述它的:1.将转换掉表达式的const性质。2.只有使用const_cast才能将const性质性质转化掉。试图使用其他三种形式的强制转换都会导致编译时的错误。(添加const还可以用其他转换符,如static_const)3.除了添加const或删除const特性,使用const_cast符来执行其他任
2016-01-18 16:49:23
285
原创 C++强制类型转换操作符 static_cast
static_cast是一个强制类型转换操作符。强制类型转换,也称为显式转换,C++中强制类型转换操作符有static_cast、dynamic_cast、const_cast、reinterpert_cast四个。本节介绍static_cast操作符。 编译器隐式执行的任何类型转换都可以由static_cast来完成,比如int与float、double与char、enum与int之
2016-01-18 16:49:17
213
原创 C++ 复制控制之复制构造函数
7月26日更新: 过了这么长的时间回过头来看,发现文章中有几个点说错(用红字标出): 构造函数不是只有唯一一个参数,它也可以是多参数形式,其第二参数及后继以一个默认值供应。 不是没有声明复制控制函数时编译器就一定会帮类声明,需要满足一定的条件。 《《==========================================================
2016-01-18 16:49:11
233
原创 static关键字总结
static,即静态声明。它在 作用域、存储方式、生命周期 等各方面影响一个变量或函数。文章将从 局部变量、全局变量、普通函数、类的static成员(包括数据成员与成员函数)来总结static。全局变量 所有的全局变量,无论是否是static的,都是存储于静态存储区的。全局变量本身就是静态存储方式,将全局变量声明为static是为了将变量的作用域限制在本翻译单元中(本源文件
2016-01-18 16:49:02
257
原创 C++ 隐式类类型转换
《C++ Primer》中提到:“可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。”这里应该注意的是, “可以用单个形参进行调用” 并不是指构造函数只能有一个形参,而是它可以有多个形参,但那些形参都是有默认实参的。那么,什么是“隐式转换”呢? 上面这句话也说了,是从 构造函数形参类型 到 该类类型 的一个编译器的自动转换。下面通过代码来看一看:
2016-01-18 16:48:56
321
原创 Unity 移动端触摸屏操作
Unity 触屏操作当将Unity游戏运行到IOS或Android设备上时,桌面系统的鼠标左键可以自动变为手机屏幕上的触屏操作,但如多点触屏等操作却是无法利用鼠标操作进行的。Unity的Input类中不仅包含桌面系统的各种输入功能,也包含了针对移动设备触屏操作的各种功能,下面介绍一下Input类在触碰操作上的使用。首先介绍一下Input.touches结构,这是一个触摸数组,每个记录代表着
2016-01-18 16:48:50
26612
11
原创 冒泡排序基本代码及其优化
冒泡排序基本代码及其优化 冒泡排序是一种交换排序,它的基本思想是:两两比较序列中相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。它的运行过程如下(以升序排序为例): 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除
2016-01-18 16:48:45
381
原创 浅谈malloc()与free()
malloc()与free()l 函数原型malloc函数的函数原型为:void* malloc(unsigned int size),它根据参数指定的尺寸来分配内存块,并且返回一个void型指针,指向新分配的内存块的初始位置。如果内存分配失败(内存不足),则函数返回NULL。l 关于返回值malloc的返回值为void*。我们在使用的时候,习惯对返回值进行强制类型转换:c
2016-01-18 16:48:37
1126
原创 如何判断循环链表
实际上判断一个链表是否是循环的思路很简单,困扰我的反而是“带环链表是否就是循环链表”这个问题,穿梭于各中帖子、书本寻找答案终究找不到明确说明。《大话数据结构》中循环链表的定义为:“将单链表中终端节点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。”也就是这个样子的:然后呢,还有其他带环链表是这个样子的:暂时先把这两种情况的
2016-01-18 16:48:31
542
原创 《将博客搬至优快云》
最近将博客搬到这里,原来在博客园。如果在博客园活跃的朋友可以关注http://www.cnblogs.com/QG-whz/互相交流学习。
2016-01-18 16:48:25
231
原创 如何来写好一个赋值运算符函数
如果面试官让你书写一个类的赋值运算符函数,他的考察点应该在:operator = 的返回值是否是一个reference to * this ,同时在函数的末尾是否返回了*this;为了支持连续的赋值,必须返回对象,否则例如a = b = c 这种语句无法通过编译。operator = 的参数是否是const reference。 reference避免了copy带来的消耗,例如调用形参的复制
2016-01-18 16:48:21
803
原创 多态基类与虚析构函数
假设我们有一个基类A,很不幸的,A的析构函数是一个non-virtual。同时我们有一个派生类B,它派生自A。我们定义了一个A类型指针,它指向的实际对象是B:A * ptr = new B;然后在程序的某处,我们不再需要B了,我们将指针ptr delete掉:delete ptr;注意new永远要和delete成队出现,除非你使用智能指针。这时由于A的析构函数是non-virtual,一
2016-01-18 16:48:17
375
原创 统一初始化语法
C++是个语法特别复杂的语言,在语法分析中时常会出现歧义,例如嵌套模板参数歧义问题:vectorint>> vec在有的编译器上会被解析为vector>vec,也就是把>>当成右移操作符了,不过C++11已经解决这个问题了。咋解决的呢,简单地说,编译器把对>>的分析延迟到语法分析阶段(原来是在词法分析阶段),词法分析器是把”>>”直接当成两个”>”传给了语法分析器,然后在语法分析中如果匹配了
2016-01-18 16:48:08
388
空空如也
c++ 中,撤销对象与清除对象的含义
2014-10-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人