小伟锅C++进阶篇
关于C++学习,相关知识、细节的进阶篇。
小伟锅
进阶的小白,大神梦!
展开
-
C++进阶—>线程同步随笔
线程同步主要有五种方法:原子访问,临界区,信号量,事件和互斥量;其中原子访问和临界区属于用户模式的同步;信号量,事件和互斥量属于内核模式的同步。 原子访问是通过将共享资源设置为原子变量,当一个线程访问的时候,其余的线程不得访问。C++使用临界区,信号量,事件和互斥量实现线程同步的时候,即定义相应的同步控制对象句柄,通过获取控制对象是否空闲来决定是否执行线程,若控制对象空闲则获取该对原创 2017-12-06 16:03:51 · 417 阅读 · 0 评论 -
C++进阶—>带你理解多字节编码与Unicode码
本篇文章将讲解C++开发中容易混淆的另一个概念——多字节字符集与Unicode字符集。多字节字符与宽字节字符char与wchar_t我们知道C++基本数据类型中表示字符的有两种:char、wchar_t。 char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因为它表示一个字时可能是一个字节也可能是多个字节。一个英文字符(如’s’)用一个char(一个字节)转载 2017-11-12 23:36:47 · 1528 阅读 · 0 评论 -
C++进阶—>Socket通信那点事
1、网络中进程之间如何通信?本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类:消息传递(管道、FIFO、消息队列)同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量)共享内存(匿名的和具名的)远程过程调用(Solaris门和Sun RPC)但这些都不是本文的主题!我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯原创 2017-11-23 17:37:04 · 1254 阅读 · 0 评论 -
C++进阶—>C++内存管理
[导语]内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支转载 2017-11-06 14:10:34 · 548 阅读 · 0 评论 -
C++进阶—>const、define和enum的区别和用途
1.区别这三种都可以定义常量。define是宏定义,编译器不对其进行错误检查,在预编译阶段处理,没有作用域限制属于全局常量,在程序中编译器会对定义的常量名以数值进行替换,且每次替换都分配内存,此方法对于大量常量的情况下会占用较多内存从而导致程序效率;const是常量定义,在编译阶段处理,作用域限制,定义常量分配内存后后续再使用常量情况下不会再为其分配内存,只分配一份内存地址,故常用于此原创 2017-11-03 20:59:15 · 1888 阅读 · 0 评论 -
C++进阶—>函数模板
0前言 C++提供了函数模板(function template)。所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。1)C++提供两原创 2017-10-10 20:46:26 · 389 阅读 · 0 评论 -
C++进阶—>类模板
1类模板 1.1为什么需要类模板类模板与函数模板的定义和使用类似,我们已经进行了介绍。 有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类: Ø 类模板用于实现类所需数据的类型参数化 Ø 类模板在表示如数组、表、图等数据结构显得特别重要, 这些数据结构的表示和算法不受所包含的元素类型的影响1.2继承中的类模板语法原创 2017-10-10 20:57:29 · 398 阅读 · 0 评论 -
C++进阶—>const和define机制剖析
C++中的const和define1 const基础知识(用法、含义、好处)初级理解:const是定义常量==》const意味着只读 const int a;int const b;const int *c;int * const d;const int * const e ;含义://第一个第二个意思一样 代表一个常整形原创 2017-10-11 14:18:25 · 306 阅读 · 0 评论 -
C++进阶—>static关键字
0 前言为什么引入static关键字? 类都有自己的成员函数和成员变量,每个类对象都具有类中所定义,各自的成员函数和成员变量,为了让不同的对象能共同访问同个类成员变量(或函数),引入static关键字,使得具有static关键字的成员变量(或函数),各个对象共同拥有。1静态成员变量1)定义静态成员变量Ø 关键字 static 可以用于说明一个类的成员,原创 2017-10-12 16:19:44 · 247 阅读 · 0 评论 -
C++进阶—>friend
0.前言friend友元,顾名思义是好朋友的意思,即我是你的好朋友,你所私有的东西会跟我分享,为我所用;通常分为友元函数和友元类。1.友元函数1)友元函数能够访问类中的私有变量;2)友元函数可以定义在类中的任何位置,public、protected、private中均可;3)友元函数为全局函数,在实现中无需加上类标识;4)函数参数为类的对象,以便对类成员进行操作;5原创 2017-10-12 16:39:13 · 301 阅读 · 0 评论 -
C++进阶—>函数重载、重写、重定义的区别
函数重载(overload)函数重载是指在一个类中声明多个名称相同但参数列表不同的函数,这些的参数可能个数或顺序,类型不同,但是不能靠返回类型来判断。特征是:(1)相同的范围(在同一个作用域中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无(注:函数重载与有无virtual修饰无关);(5)返回值可以不同;函数重写(也称为覆盖 overr转载 2017-10-13 15:53:45 · 449 阅读 · 0 评论 -
C++进阶—>内联函数inline
在.h中int max(int a, int b);在.cpp中int max(int a, int b){ return a>b?a:b;}定义函数的好处:1)通过函数名称,可以直观直接函数意义;2)如果需要修改,修改函数比修改变量表示容易;3)函数可以重复调用。但函数缺点:调用函数比直接的表达式要慢的多,大多数机器在调用函数的过程中原创 2017-10-20 10:48:30 · 214 阅读 · 0 评论 -
C++进阶—>以操作系统的角度述说线程与进程
什么是线程什么是线程?线程与进程与有什么关系?这是一个非常抽象的问题,也是一个特别广的话题,涉及到非常多的知识。我不能确保能把它讲的话,也不能确保讲的内容全部都正确。即使这样,我也希望尽可能地把他讲通俗一点,讲的明白一点,因为这是个一直困扰我很久的,扑朔迷离的知识领域,希望通过我的理解揭开它一层一层神秘的面纱。 任务调度线程是什么?要理解这个概念,须要先了解一下操作转载 2017-10-26 11:32:49 · 330 阅读 · 0 评论 -
C++进阶—>线程优先级与线程安全
线程优先级现在主流操作系统(如Windows、Linux、Mac OS X)的任务调度除了具有前面提到的时间片轮转的特点外,还有优先级调度(Priority Schedule)的特点。优先级调度决定了线程按照什么顺序轮流执行,在具有优先级调度的系统中,线程拥有各自的线程优先级(Thread Priority)。具有高优先级的线程会更早地执行,而低优先级的线程通常要等没有更高优先级的可执行线转载 2017-10-26 11:34:46 · 3522 阅读 · 0 评论 -
C++进阶—>C++中的多线程
本文将接着讲一下C++中多线程程序的开发.这里主要讲Windows平台线程的用法,创建线程要调用windows API的CreateThread方法。创建线程在Windows平台,Windows API提供了对多线程的支持。前面进程和线程的概念中我们提到,一个程序至少有一个线程,这个线程称为主线程(main thread),如果我们不显示地创建线程,那我们产的程序就是只有主线程的间转载 2017-10-26 11:36:12 · 276 阅读 · 0 评论 -
C++进阶—> CloseHandle详解及CloseHandle后线程未停
函数说明BOOL CloseHandle(HANDLE hObject);参数hObject :代表一个已打开对象handle。返回值TRUE:执行成功;FALSE:执行失败,可以调用GetLastError()获知失败原因。函数用于关闭一个内核对象。CloseHandle到底做了什么?当调用CloseHandle成功后,相关的内核对象的引用原创 2017-10-26 14:14:52 · 13258 阅读 · 3 评论 -
C++进阶—>终止线程的运行
1 终止线程的运行若要终止线程的运行,可以使用下面的方法:• 线程函数返回(最好使用这种方法)。• 通过调用E x i t T h r e a d函数,线程将自行撤消(最好不要使用这种方法)。• 同一个进程或另一个进程中的线程调用Te r m i n a t e T h r e a d函数(应该避免使用这种方法)。• 包含线程的进程终止运行(应该避免使用这种方法)。下面将介原创 2017-10-26 14:53:18 · 2003 阅读 · 0 评论 -
C++进阶—>CreateEvent控制线程
1.概述 事件对象就像一个开关:它只有两种状态---开和关。当一个事件处于”开”状态,我们称其为”有信号”否则称为”无信号”。可以在一个线程的执行函数中创建一个事件对象,然后观察它的状态,如果是”无信号”就让该线程睡眠,这样该线程占用的CPU时间就比较少。2.CreateEvent函数产生事件对象的函数如下: HANDLE CreateEvent(LPSECURIT原创 2017-10-26 20:28:14 · 1391 阅读 · 0 评论 -
C++进阶—>互斥量:Event控制:多线程实现生产者-消费者例子
一个典型的生产者-消费者问题,它们公用的资源是SharedBuffer,当Buffer中有数据且未满时,两个线程都可以运行,当Buffer为 空时,Consumer就要等待,直到Buffer不为空,这里就是用event来实现的;同样,当Buffer为满时,Producer就要等待。 开发环境:VS2012,win32控制台程序#include "stdafx.h"#include原创 2017-10-26 20:58:59 · 433 阅读 · 0 评论 -
C++进阶—>易错知识点随笔
static 静态变量和静态成员函数:1)静态变量和静态函数是属于整个类的而不是某个对象,其只存储一份地址供所有对象共用;2)使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存;3)静态成员函数不能调用非静态成员变量和非静态成员函数,因为静态成员函数属于整个类,在类实例化对象之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间,就原创 2017-10-27 18:47:36 · 230 阅读 · 0 评论 -
C++进阶—>子类、父类、父父类间虚函数调用详解
class one{public: one(int data=0):m1_data(data) { } int GetData() { return dodata(); } virtual int dodata() { return m1_data; }public: int m1_data;};class two:public one{pub原创 2017-10-28 10:46:41 · 10661 阅读 · 2 评论 -
C++进阶—>各类型占大小及sizeof函数
本文针对32位编译器而言,64位编译器同理。/**********************************************各类型所占大小***************************************************/本部分参考http://blog.csdn.net/ynnmnm/article/details/45826963,但存在改进!#i原创 2017-10-28 14:00:36 · 1193 阅读 · 1 评论 -
C++进阶—>线程同步的四种方式
线程之间通信的两个基本问题是互斥和同步。(1)线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。(2)线程互斥是指对于共享的操作系统资源(指的是广义的”资源”,而不是Windows的.res文件,譬如全局变量就是一种共享资源),在各线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何转载 2017-10-28 14:30:17 · 811 阅读 · 0 评论 -
C++进阶—>malloc/free与new/delete的区别
相同点:都可用于申请动态内存和释放内存不同点:(1)操作对象有所不同。malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内转载 2017-10-28 16:40:21 · 344 阅读 · 0 评论