自定义博客皮肤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)
  • 资源 (1)
  • 收藏
  • 关注

原创 图说C++对象模型:对象内存布局详解

0.前言文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局、虚表指针、虚基类指针等有深入了解的朋友可以慢慢看。本文的结论都在VS2013上得到验证。不同的编译器在内存布局的细节上可能有所不同。文章如果有解释不清、解释不通或疏漏的地方,恳请指出。1.何为C++对象模型?引用《深度探索C++对象模型》这本书中的话:有两个概念可以解释C++对象模型:语言中直接支持面向...

2019-01-26 15:51:23 142

原创 C++ 引用计数技术及智能指针的简单实现

1.智能指针是什么简单来说,智能指针是一个类,它对普通指针进行封装,使智能指针类对象具有普通指针类型一样的操作。具体而言,复制对象时,副本和原对象都指向同一存储区域,如果通过一个副本改变其所指的值,则通过另一对象访问的值也会改变.所不同的是,智能指针能够对内存进行进行自动管理,避免出现悬垂指针等情况。2.普通指针存在的问题C语言、C++语言没有自动内存回收机制,关于内存的操作的安全性依...

2019-01-26 11:10:49 170

原创 漫谈 C++:良好的编程习惯与编程要点

以良好的方式编写C++ class假设现在我们要实现一个复数类complex,在类的实现过程中探索良好的编程习惯。① Header(头文件)中的防卫式声明complex.h:# ifndef  __COMPLEX__# define __COMPLEX__class complex{ }# endif防止头文件的内容被多次包含。② 把数据放在pr...

2019-01-26 11:01:39 193

原创 学会了C语言/C++能做什么?我们一起来看看吧!

大部分初学者都在想!!学会了C/C++能做什么程序员,今天我就来告诉大家!服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等!这就是我们的答案,,不知道其中有没有各位想去发展的方向呢!有兴趣学习交流C语言C++编程的伙伴可加群:941 636 0...

2019-01-25 20:25:04 4407

原创 程序员是否有义务做好代码的注释?你做好代码注释了吗?

关于编程,代码注释是一个很重要的部分,从某种程度上,代码注释也反应了一个程序员的专业素养,下面我们就来聊聊程序员和代码注释的那些事。一些典型的场景场景一:某天,一个程序员因为一些事情感到心理很委屈,于是他决定,以后写代码的时候,我尽量将注释写得模棱两可,写得简单些。场景二:某天,一个程序员因为工作分配不均,然后他决定,尽可能的少写注释或者文档。两种常见的注释//和/**...

2019-01-25 20:21:51 215

原创 ProtoBuf 反射详解

Protocol Buffer 简称 ProtoBuf,是用于结构化数据串行化的灵活、高效、自动的方法,又如 XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。本文主要介绍 protobuf 里的反射功能,使用的pb版本为2.6.1,同时为了简洁,对 repeated/extensio...

2019-01-25 20:20:32 2048

原创 要是有了垃圾回收,还会不会发生内存泄漏?

问题的发现这个问题是我在写C++时考虑到的,C++需要手动管理内存,虽然现在标准库中提供了一些智能指针,可以实现基于引用计数的自动内存管理,但现实环境是很复杂的,我们仍要注意循环引用的问题。还有一个容易被忽视的问题就是对象间关系的“占有”和“非占有”,这个问题其实在具有GC的C#和Java中也一样存在。目前.NET和Java的GC策略都属于Tracing garbage collectio...

2019-01-24 20:38:20 244

原创 C++ 线程池实现原理

背景多线程编程是C++开发者的一个基本功, 但是很多开发者都是直接使用公司给包装好的线程池库, 没有去了解具体实现,有些实现也都因为高度优化而写得讳莫如深,让初学者看得吃力。所以写这篇文章主要是想以非常简单的方式讲讲实现原理, 希望初学者看完之后不是觉得「不明觉厉」,而是觉得「原来如此」。面朝代码首先先来一段超级简单(注释丰富)的代码展示多线程编程的经典写法。注: 该段代码和完...

2019-01-24 19:46:44 3074

原创 一套帮助你理解 C 语言的测试题,欢迎使用!

在 steven kobes 上发现一套很有趣的C语言测试题,如果你招聘C语言相关开发人员,或者正在学习C语言,很值得做一做。如果没有做,下面内容暂时不要看,最好自己先完成一遍。OK,假设你做的答案没有完全正确,那你可以继续看下去了,否则,后面内容对你来说就是小菜一碟,不值得看。第一题:#includestatic jmp_buf buf;int main(void)...

2019-01-24 19:29:44 201

原创 C++中引用和匿名对象的理解和本质剖析

大家对C++的引用应该都不陌生吧,抱着既要知其然,也要知其所以然的态度。下面将按照是什么?怎么用?为什么需要?本质剖析的流程来向大家一一描述。引用是什么?引用其实就是给变量起的一个别名,使用这个别名跟使用变量名没有区别。那什么又是变量名呢?变量名实质上是一段连续存储空间的别名,是一个标号(门牌号),编译器通过变量来申请并命名内存空间,程序员可以通过变量的名字可以使用存储空间。也...

2019-01-24 16:18:53 481

原创 一个例子记住C++对象的生存周期

代码代码说明:类A,含构造函数和析构函数普通函数fun,函数体里新建了类A的局部自动对象FunObj和局部静态对象InStaObjmain方法新建了类A的局部自动对象MainObj,调用fun方法外面新建了A的的外部静态对象ExStaObj和外部对象GblObj#include <iostream>#include <string.h>us...

2019-01-23 15:35:39 197

原创 霍金曾说:人工智能会毁灭人类!它到底是天使还是魔鬼?

相信很多人都在看过科幻小说,或多或少幻想过那种机器人主宰世界或者占领世界的场景。那么,这种事情到底有没有可能发生呢?我们一起来看看人工智能吧!中国就业促进会副会长陈宇在一次讨论中提出人类与人工智能未来发展的两条道路:人类确实已经走到了一个十字路口,人类面前摆着非常严峻而重大的选择。实际上,人类发展到今天,大多数人并没有过上人应当过的生活。大多数人其实都是别人的机器,别人的奴隶。人工智能...

2019-01-23 14:31:45 2545 1

原创 C语言编程: 函数调用中堆栈的个人理解

接下来将通过下面几个问题解析函数调用中对堆栈理解:(1)函数调用过程中堆栈在内存中存放的结构如何?(2)汇编语言中call,ret,leave等具体操作时如何?(3)linux中任务的堆栈,数据存放是如何?1. 函数调用过程中堆栈在内存中存放的结构如何?计算机,嵌入式设备,智能设备等其实都是有软件和硬件两部分组成,具体实现也许复杂,但整体的结构也就如此。软件运行在硬件上,告诉硬...

2019-01-23 13:11:44 486

原创 常用的 STL 查找算法

常用的 STL 查找算法《effective STL》中有句忠告,尽量用算法替代手写循环;查找少不了循环遍历,在这里总结下常用的STL查找算法;查找有三种,即点线面:(1)点就是查找目标为单个元素;(2)线就是查找目标为区间;(3)面就是查找目标为集合;针对每个类别的查找,默认的比较函数是相等,为了满足更丰富的需求,算法也都提供了自定义比较函数的版本;单个元素查找f...

2019-01-23 13:01:55 294

原创 c#编程知识:高效使用STL

高效使用STL仅仅是个选择的问题,都是STL,可能写出来的效率相差几倍;熟悉以下条款,高效的使用STL;当对象很大时,建立指针的容器而不是对象的容器1)STL基于拷贝的方式的来工作,任何需要放入STL中的元素,都会被复制;这也好理解,STL工作的容器是在堆内开辟的一块新空间,而我们自己的变量一般存放在函数栈或另一块堆空间中;为了能够完全控制STL自己的元素,为了能在自己的地盘随...

2019-01-23 11:20:04 965 1

原创 C++11中对类(class)新增的特性

突然发现以前的一篇老文default/delete 控制默认函数在我们没有显式定义类的复制构造函数和赋值操作符的情况下,编译器会为我们生成默认的这两个函数:默认的赋值函数以内存复制的形式完成对象的复制。这种机制可以为我们节省很多编写复制构造函数和赋值操作符的时间,但是在某些情况下,比如我们不希望对象被复制,在之前我们需要将复制构造函数和赋值操作符声明为private,现在可以使用del...

2019-01-22 18:54:27 192

原创 C++(11)在时空性能方面的改进

主要包括以下方面:1.新增的高效容器:array、forward_list以及unordered containers;2.以及常量表达式、静态断言和move语义;大小固定容器 arraystd::array是一个支持随机访问且大小(size)固定的容器,它是c++11中新增的容器。它有如下特点:不预留多余空间,只分配必须空间(译注:size() == capacity())。...

2019-01-22 13:47:30 238

原创 C++11带来的优雅语法

自动类型推导 autoauto的自动类型推导,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推导,可以简化我们的编程工作;auto是在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响;另外,似乎auto也并不会影响编译速度,因为编译时本来也要右侧推导然后判断与左侧是否匹配。auto a; // 错误,auto是通过初始化表达式进⾏类型推导,如果没有...

2019-01-22 11:28:19 352

原创 给初学算法者的礼物:三个精彩算法的解析

我在这里提供我见识到的三个精彩算法的解析,强烈地推荐给初学的算法爱好者,它们可能会令你眼界大开,同时坚定你在算法大道上勇往直前的信念。#3. 二进制是人类的好朋友,在线的树的最近公共祖先(LCA)算法:利用数的二进制表示可以产生很多加速算法,online-LCA是其中之一。许多算法的加速是对数率的,就是利用了数的二进制表示。首先定义二维数组:prede[N+1][B+1], N表示树的...

2019-01-21 21:03:41 225

原创 为什么我说C语言是最好的游戏开发语言!

我需要的开发语言是什么样的?有些要求是没有商量余地的。首先,它必须是可靠的。我不能接受把时间浪费在处理那些不是我引起的bug上。过去我开发的很多游戏都是基于flash的,现在flash技术已经离寿终正寝不远了。我不想花费时间将老游戏移植到新的平台上,我想开发新的游戏。我需要找一个我有信心它能存在很长一段时间的平台。同样我不希望把自己绑定在一个特定的操作系统上,我理想 的操作系统最好有开...

2019-01-21 15:09:46 778

原创 有没有一段代码,让你觉得人类的智慧也可以璀璨无比?

Kyle McCormick 在 StackExchange 上发起了一个叫做Tweetable Mathematical Art的比赛,参赛者需要用三条推这么长的代码来生成一张图片。具体地说,参赛者需要用 C++ 语言编写 RD 、 GR 、 BL 三个函数,每个函数都不能超过 140 个字符。每个函数都会接到 i 和 j 两个整型参数(0 ≤ i, j ≤ 1023),然后需要返回一个 0...

2019-01-21 10:41:36 237

原创 宏语言为何不受欢迎?

人类用计算机处理文本主要是依赖宏语言以及一些专用的文本编辑器。事实上,早期的文本编辑器只提供基本的文本编辑功能,然后借助宏语言进行功能扩展。结果人类很快就发现,基于宏扩展的编辑器,功能越复杂,它的行为就越诡异。于是,文本编辑器的扩展语言很快就被换成了当时的一种通用的动态类型的函数式编程语言——Lisp。实际上,这就是 Emacs 的前世与今生。研究编程语言设计的人,所追求的目标是,怎样定义一套文...

2019-01-21 10:36:16 230

原创 C++的泛型编程

代码膨胀C++ 的泛型编程是基于模板实现的,而 C++ 的模板采用的是代码膨胀技术。例如 std::list 容器,如果你将 int 类型的数据存进去,C++ 编译器就为你生成一个专门用来存 int 类型数据的列表数据结构。也就是说,你向 std::list 容器中存放什么类型,C++ 编译器就为你生成相应的列表数据结构。理论上,数据的类型是无限的,因此 C++ 要生成的列表数据结构也是无限的。...

2019-01-20 19:45:08 3251

原创 面向指针编程(二)

数据再抽象上一节的代码有些冗长,我们可以尝试对其进行精简。首先看下面这三个结构体及其 create函数:struct point { double x; double y;};struct rectangle { double width; double height;};struct circle { struct point *cen...

2019-01-19 20:56:43 222

原创 面向指针编程(一)

面向对象编程,面向设计模式编程(亦即设计模式),面向接口编程,面向模板编程(亦即泛型编程),面向函数编程(亦即函数式编程),面向多核时代的并行编程,面向大数据的机器学习编程……这么多年,大家要面向的东西已经够多了,然而我看到的现象是,很多编程语言让大家面向 xxx 的同时在竭力回避指针。我可不想面向这么多东西,所以我只好加入指针的黑暗势力。我要不自量力的来写一篇《面向指针编程》作为投名状,借以表示...

2019-01-19 20:54:09 198

原创 C语言精华:指针有害健康?

黑暗的内存很多人对 C 语言深恶痛绝,仅仅是因为 C 语言迫使他们在编程中必须手动分配与释放内存,然后通过指针去访问,稍有不慎可能就会导致程序运行运行时出现内存泄漏或内存越界访问。C 程序的内存泄漏只会发生在程序所用的堆空间内,因为程序只能在堆空间内动态分配内存。NULL 指针、未初始化的指针以及引用的内存空间被释放了的指针,如果这些指针访问内存,很容易就让程序挂掉。除了堆空间,程序还...

2019-01-18 18:49:10 667

原创 C++11编程知识:右值引用

概述右值引用的概念有些读者可能会感到陌生,其实他和C++98/03中的左值引用有些类似,例如,c++98/03中的左值引用是这样的:int i = 0;int& j = i;这里的int&是对左值进行绑定(但是int&却不能绑定右值),相应的,对右值进行绑定的引用就是右值引用,他的语法是这样的A&&,通过双引号来表示绑定类型为A的右值。通...

2019-01-18 10:59:55 231

原创 自己动手制作C 语言编译器(9):总结

恭喜你完成了自己的 C 语言编译器,本章中我们发一发牢骚,说一说编写编译器值得注意的一些问题;编写编译器时遇到的一些难题。本系列:自己动手制作C 语言编译器(0):前言自己动手制作C 语言编译器(1):设计自己动手制作C 语言编译器(2):虚拟机自己动手制作C 语言编译器(3):词法分析器自己动手制作C 语言编译器(4):递归下降自己动手制作C 语言编译器(5):变量定...

2019-01-17 20:44:02 1408

原创 自己动手制作C 语言编译器(8):表达式

这是整个编译器的最后一部分,解析表达式。什么是表达式?表达式是将各种语言要素的一个组合,用来求值。例如:函数调用、变量赋值、运算符运算等等。表达式的解析难点有二:一是运算符的优先级问题,二是如何将表达式编译成目标代码。我们就来逐一说明。运算符的优先级运算符的优先级决定了表达式的运算顺序,如在普通的四则运算中,乘法*优先级高于加法+,这就意味着表达式2 + 3 * 4的实际运行顺序是2 ...

2019-01-17 11:13:05 728

原创 自己动手制作C 语言编译器(6):函数定义

由于语法分析本身比较复杂,所以我们将它拆分成 3 个部分进行讲解,分别是:变量定义、函数定义、表达式。本章讲解函数定义相关的内容。EBNF 表示这是上一章的 EBNF 方法中与函数定义相关的内容。variable_decl ::= type {'*'} id { ',' {'*'} id } ';' function_decl ::= type {'*'} id '(' pa...

2019-01-16 19:56:45 353

原创 自己动手制作C 语言编译器(5):变量定义

本章中我们用 EBNF 来大致描述我们实现的 C 语言的文法,并实现其中解析变量定义部分。由于语法分析本身比较复杂,所以我们将它拆分成 3 个部分进行讲解,分别是:变量定义、函数定义、表达式。EBNF 表示EBNF 是对前一章提到的 BNF 的扩展,它的语法更容易理解,实现起来也更直观。但真正看起来还是很烦,如果不想看可以跳过。program ::= {global_declar...

2019-01-16 15:08:50 494

原创 自己动手制作C 语言编译器(4):递归下降

本章我们将讲解递归下降的方法,并用它完成一个基本的四则运算的语法分析器。什么是递归下降传统上,编写语法分析器有两种方法,一种是自顶向下,一种是自底自上。自顶向下是从起始非终结符开始,不断地对非终结符进行分解,直到匹配输入的终结符;自底向上是不断地将终结符进行合并,直到合并成起始的非终结符。其中的自顶向下方法就是我们所说的递归下降。终结符与非终结符没有学过编译原理的话可能并不知道...

2019-01-16 13:10:48 560 1

原创 自己动手制作C 语言编译器(3):词法分析器

本篇我们要讲解如何构建词法分析器。什么是词法分析器简而言之,词法分析器用于对源码字符串做预处理,以减少语法分析器的复杂程度。词法分析器以源码字符串为输入,输出为标记流(token stream),即一连串的标记,每个标记通常包括:(token, token value)即标记本身和标记的值。例如,源码中若包含一个数字'998',词法分析器将输出(Number, 998),即(数字,99...

2019-01-16 10:59:17 1127

原创 自己动手制作C 语言编译器(2):虚拟机

本章我们要构建一台虚拟的电脑,设计我们自己的指令集,运行我们的指令集,说得通俗一点就是自己实现一套汇编语言。它们将作为我们的编译器最终输出的目标代码。计算机的内部工作原理我们关心计算机的三个基本部件:CPU、寄存器及内存。代码(汇编指令)以二进制的形式保存在内存中,CPU 从中一条条地加载指令执行。程序运行的状态保存在寄存器中。内存我们从内存开始说起。现代的操作系统都不直接使用内存...

2019-01-15 20:30:35 1255

原创 自己动手制作C 语言编译器(1):设计

这篇文章我们要从整体上讲解如何设计我们的 C 语言编译器。本系列:首先要说明的是,虽然标题是编译器,但实际上我们构建的是 C 语言的解释器,这意味着我们可以像运行脚本一样去运行 C 语言的源代码文件。这么做的理由有两点:1.解释器与编译器仅在代码生成阶段有区别,而其它方面如词法分析、语法分析是一样的。2.解释器需要我们实现自己的虚拟机与指令集,而这部分能帮助我们了解计算机的工作原理...

2019-01-15 20:29:08 2396 1

原创 自己动手制作C 语言编译器(0):前言

“手把手教你构建 C 语言编译器” 这一系列教程将带你从头编写一个 C 语言的编译器。希望通过这个系列,我们能对编译器的构建有一定的了解,同时,我们也将构建出一个能用的 C 语言编译器,尽管有许多语法并不支持。在开始进入正题之前,本篇是一些闲聊,谈谈这个系列的初衷。如果你急切地想进入正篇,请跳过本章。前言为什么要学编译原理如果要我说计算机专业最重要的三门课,我会说是《数据结构》、《...

2019-01-15 11:12:31 1195

原创 C++小知识:为什么错误代码能正常工作

本篇案例来自 Miranda NG 源码。错误代码:#define MF_BYCOMMAND 0x00000000Lvoid CMenuBar::updateState(const HMENU hMenu) const{  ....  ::CheckMenuItem(hMenu, ID_VIEW_SHOWAVATAR,    MF_BYCOMMAND | dat-&g...

2019-01-14 11:59:39 510

原创 C++小知识:不要节约代码行数

本篇案例来自 KDE4 源码。错误代码:void LDAPProtocol::del( const KUrl &_url, bool ){  ....  if ( (id = mOp.del( usrc.dn() ) == -1) ) {    LDAPErr();    return;  }  ret = mOp.waitForResult( id,...

2019-01-14 11:38:13 169

C语言之入门基础理论

该视频为介绍C语言的入门基础理论视频,其主要为入门的萌新使用,主要介绍一些例如C语言的由来,计算机的发展等等,本人希望对各位学习C语言的小伙伴有一点帮助。如果有的小伙伴有想法的话,欢迎进群 941636044 一起交流一下!

2018-12-01

空空如也

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

TA关注的人

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