随笔分类 -  C++

摘要:1.C++内存分配方式 堆:堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。 栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处 阅读全文
posted @ 2020-02-22 08:23 卖雨伞的小男孩 阅读(292) 评论(0) 推荐(0) 编辑
摘要:C++ 的new 运算子和C 的malloc 函数都是为了配置内存,但前者比之后者的优点是,new 不但配置对象所需的内存空间时,同时会引发构造式的执行。 所谓构造式(constructor),就是对象诞生后第一个执行(并且是自动执行)的函数,它的函数名称必定要与类别名称相同。 相对于构造式,自然就 阅读全文
posted @ 2020-02-22 08:06 卖雨伞的小男孩 阅读(936) 评论(0) 推荐(0) 编辑
摘要:一、前序 什么是智能指针? ——是一个类,用来存储指针(指向动态分配对象也就是堆中对象的的指针)。 c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写了,但是我们不能避免程序还未执行到delete时就跳转了或者在函数中没有执行到最后的delete语句 阅读全文
posted @ 2019-05-28 09:57 卖雨伞的小男孩 阅读(5033) 评论(0) 推荐(2) 编辑
摘要:一、前言 本人作为一个工作了5年的程序员,程序生涯最初是从c/c++开始的,但是始终不能很熟悉的理解c语言中的指针和c++中的引用,归其原因,一部分自己没有静下心来思考,一部分原因是其自身的复杂性。 二、符号的多义性 我们定义一个变量 int a=10;那么我们可以看到它(基本类型)由声明符列表+变 阅读全文
posted @ 2019-05-24 18:34 卖雨伞的小男孩 阅读(1549) 评论(0) 推荐(0) 编辑
摘要:一、程序在内存中被执行的过程 流程说明1、操作系统把物理硬盘代码load到内存2、操作系统把c代码分成四个区3、操作系统找到main函数入口执行 二、四区的说明 一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操 阅读全文
posted @ 2019-05-24 14:19 卖雨伞的小男孩 阅读(1872) 评论(0) 推荐(0) 编辑
摘要:进程间通信方式 这部分参考文献2:详细内容打开链接看 程序员必须让拥有依赖关系的进程集协调,这样才能达到进程的共同目标。可以使用两种技术来达到协调。第一种技术在具有通信依赖关系的两个进程间传递信息。这种技术称做进程间通信(interprocess communication)。第二种技术是同步,当进 阅读全文
posted @ 2019-03-22 16:32 卖雨伞的小男孩 阅读(179) 评论(0) 推荐(0) 编辑
摘要:容器是一种容纳特定类型对象的集合。C++的容器可以分为两类:顺序容器和关联容器。顺序容器的元素排列和元素值大小无关,而是由元素添加到容器中的次序决定的。标准库定义了三种顺序容器的类型:vector、list和deque(双端队列)。此外,标准库还提供了三种容器适配器:stack、queue和prio 阅读全文
posted @ 2019-03-14 17:43 卖雨伞的小男孩 阅读(192) 评论(0) 推荐(0) 编辑
摘要:一、关联容器 C++的容器类型可以分为顺序容器和关联容器两大类。对于关联容器,主要有map和set,对于这两种,根据不同的维度,衍生出了8种容器 map //值对 set //仅有值 multimap //允许关键字重复的值对 multiset //允许重复的值 unordermap //无序值对 阅读全文
posted @ 2019-03-14 17:41 卖雨伞的小男孩 阅读(229) 评论(0) 推荐(0) 编辑
摘要:一、泛型算法泛型算法这个概念是针对容器操作的,我们知道,c++11的顺序容器有vector,list,deque等,对于这些容器,c++11并没给出相应的增删改查方法,而是定义了一组泛型算法 一般的泛型算法都定义在#include <algorithm>中,对于数值的有些算法则定义在#include 阅读全文
posted @ 2019-03-13 16:25 卖雨伞的小男孩 阅读(237) 评论(0) 推荐(0) 编辑
摘要:在其他语言中,我们常见lambda表达式,c++11中也引入了。 利用Lambda表达式,可以方便的定义和创建匿名函数。今天,我们就来简单介绍一下C++中Lambda表达式的简单使用。 一、lambda的声明 完整声明如下: 各项具体含义如下 简略形式 格式1声明了const类型的表达式,这种类型的 阅读全文
posted @ 2019-03-07 18:05 卖雨伞的小男孩 阅读(236) 评论(0) 推荐(0) 编辑
摘要:一、条件变量的引入 std::condition_variable 解决了死锁并且控制的资源的访问顺序二避免不必要的等待。当互斥操作不够用而引入的。比如,线程可能需要等待某个条件为真才能继续执行,而一个忙等待循环中可能会导致所有其他线程都无法进入临界区使得条件为真时,就会发生死锁。所以,condit 阅读全文
posted @ 2019-03-01 17:58 卖雨伞的小男孩 阅读(1619) 评论(0) 推荐(0) 编辑
摘要:序言 互斥锁保证了线程间的同步,但是却将并行操作变成了串行操作,这对性能有很大的影响,所以我们要尽可能的减小锁定的区域,也就是使用细粒度锁。 这一点lock_guard做的不好,不够灵活,lock_guard只能保证在析构的时候执行解锁操作,lock_guard本身并没有提供加锁和解锁的接口,但是有 阅读全文
posted @ 2019-02-28 15:19 卖雨伞的小男孩 阅读(526) 评论(0) 推荐(0) 编辑
摘要:一、死锁的产生 死锁的原因有两个 a、mutex的lock正确执行了,但是使用资源的时候发生了异常,导致unlock虽然调用了,但是没有执行,也就没有解锁 b、多把锁 两个mutex的时候,mutex1,mutex2 如果两把锁两个线程的顺序不一致,会造成相互等待释放资源,造成死锁 二、死锁的避免 阅读全文
posted @ 2019-02-28 14:33 卖雨伞的小男孩 阅读(999) 评论(0) 推荐(0) 编辑
摘要:一、数据竞争的产生 在下面例子中: void function_1() { for (int i = 0; i < 100; i++) { std::cout << "from function 1:" << i << std::endl; } } int main() { std::thread 阅读全文
posted @ 2019-02-28 11:56 卖雨伞的小男孩 阅读(532) 评论(0) 推荐(0) 编辑
摘要:1、简单的例子 #include "stdafx.h" #include <iostream> #include <thread> void function_1() { for (size_t i = 0; i < 100; i++) { std::cout << "from function 1 阅读全文
posted @ 2019-02-28 11:15 卖雨伞的小男孩 阅读(417) 评论(0) 推荐(0) 编辑
摘要:(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。 阅读全文
posted @ 2017-08-04 14:50 卖雨伞的小男孩 阅读(158) 评论(0) 推荐(0) 编辑
摘要:一。定义如:map < int, CString > 或者 map < int, 结构体名>的元素遍历 map < int, CString > map; 或者map < int, 结构体名> map; for(int i=0;i < map. size() ; i++) { CString s=m 阅读全文
posted @ 2017-06-22 16:58 卖雨伞的小男孩 阅读(4605) 评论(0) 推荐(0) 编辑
摘要:一、热键注册 步骤一:声明一个全局量int hotkeyId=1: 步骤二:窗体创建的时候注册: int result= RegisterHotKey(this->GetHWND(), hotkeyId, MOD_ALT, 'C'); 步骤三:热键消息处理(窗体消息处理函数中) if (uMsg = 阅读全文
posted @ 2017-06-19 18:25 卖雨伞的小男孩 阅读(7063) 评论(0) 推荐(0) 编辑
摘要:左值和右值的定义 在C++中,可以放到赋值操作符=左边的是左值,可以放到赋值操作符右边的是右值。有些变量既可以当左值又可以当右值。进一步来讲,左值为Lvalue,其实L代表Location,表示在内存中可以寻址,可以给它赋值(常量const类型也可以寻址,但是不能赋值),Rvalue中的R代表Rea 阅读全文
posted @ 2017-03-27 12:45 卖雨伞的小男孩 阅读(1614) 评论(0) 推荐(0) 编辑
摘要:1. std::promise 可以用来在线程间提供数据传递。 std::future = std::promise.get_future()。 线程中可以对promise赋值std::promise.set_value。 赋值之后std::future.get()就会返回其他线程中设置的值。 #i 阅读全文
posted @ 2017-03-22 11:24 卖雨伞的小男孩 阅读(12542) 评论(0) 推荐(2) 编辑

点击右上角即可分享
微信分享提示