C++提高
文章平均质量分 75
c++
Overboom
这个作者很懒,什么都没留下…
展开
-
[C++深入] --- 类成员初始化的三种方式
初始化列表是在构造函数冒号后对成员进行初始化,这是在成员被分配内存的同时进行的初始化操作。这样避免了成员变量先被默认构造然后再赋值的过程。原创 2024-06-27 19:25:02 · 380 阅读 · 0 评论 -
[C++深入] --- vector容器浅析
如果type是内置类型,emplace_back和push_back无差异。原创 2024-06-27 15:30:06 · 1065 阅读 · 0 评论 -
[C++深入] --- malloc/free和new/delete
在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区。自由存储区是C++基于new操作符的一个抽象概念,。new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。那么自由存储区是否能等于堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。原创 2024-06-24 16:42:58 · 889 阅读 · 0 评论 -
[C++ 提高] --- 类的存储 和 包含虚函数的类
1 从内存四区的角度分析类的存储如果一个类包括了数据和函数,用这个类去实例化对象时,系统会为每一个对象分配存储空间。每个对象所占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分)所占用的存储空间,而不包括函数代码所占用的存储空间。C++编译系统会用一段空间来存放这个共同的函数代码段,在调用各对象的函数时,都去调用这个公用的函数代码。 C++程序的内存格局通常分为四个区:全局数据区(data area),代码区(code area),栈区(stack area),堆区(heap原创 2022-01-21 15:41:37 · 767 阅读 · 0 评论 -
POSIX 定时器使用
posix定时器最强大的定时器接口来自POSIX时钟系列,其创建、初始化以及删除一个定时器的行动被分为三个不同的函数:timer_create()(创建定时器)、timer_settime()(初始化定时器)以及timer_delete(销毁它)。创建一个定时器int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid);进程可以通过调用timer_create()创建特定的定时器,定时器是每个进程自己的,转载 2022-01-09 16:58:37 · 543 阅读 · 0 评论 -
C++隐式类型转换
隐式类型转换针对不同的类型有不同的转换方式,总体可以分为两种类型,算术类型和类类型。1. 算术类型转换算术类型转换的设计原则就是尽可能避免损失精度。具体地,有以下几条参考规则:整型提升:将小整数类型转换成较大的整数类型。例如,如果一个运算对象的类型是long double,那么另外一个运算对象,无论它的类型是什么,都会被转换成long double。有符号类型转换为无符号类型。类型转换一般不会改变对象内存的值,当一个有符号类型的对象转换为无符号类型时,其表示出来的值可能发生变化,例如,int a原创 2021-12-27 19:21:03 · 7239 阅读 · 1 评论 -
settime计时器和POSIX timer函数
Linux 系统上最常用的定时器是 setitmer 计时器settimmmer原型:int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);which为定时器类型,setitimer支持3种类型的定时器:ITIMER_REAL: 以系统真实的时间来计算,它送出SIGALRM信号。ITIMER_VIRTUAL: -以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。ITI原创 2021-10-28 13:52:48 · 618 阅读 · 0 评论 -
Linux/Unix下几种实现定时的方式总结
定时器Timer应用场景非常广泛,在Linux下,有以下几种方法:1. 使用sleep()和usleep()其中sleep精度是1秒,usleep精度是1微妙,具体代码就不写了。使用这种方法缺点比较明显,在Linux系统中,sleep类函数不能保证精度,尤其在系统负载比较大时,sleep一般都会有超时现象。2. 使用信号量SIGALRM + alarm()这种方式的精度能达到1秒,其中利用了*nix系统的信号量机制,首先注册信号量SIGALRM处理函数,调用alarm(),设置定时长度,代码如下:转载 2021-10-28 11:11:36 · 431 阅读 · 0 评论 -
回调函数示例讲解
1. 什么是回调函数关于回调函数的定义,可以自行Wikipedia,但是我觉得官方的都太晦涩,看了还是弄不懂。这里给出在一个帖子上看到的定义,本人觉得比较好理解。函数 F1 调用函数 F2 的时候,函数 F1 通过参数给 函数 F2 传递了另外一个函数 F3 的指针,在函数 F2 执行的过程中,函数F2 调用了函数 F3,这个动作就叫做回调(Callback),而先被当做指针传入、后面又被回调的函数 F3 就是回调函数。回调函数最大的好处就是降低耦合度。2. 具体示例2.1 简单的回调函数【函数指原创 2021-10-27 16:10:21 · 187 阅读 · 0 评论 -
C++单例模式
1. 什么是单例模式因为在设计或开发中,肯定会有这么一种情况,一个类只能有一个对象被创建,如果有多个对象的话,可能会导致状态的混乱和不一致。这种情况下,单例模式是最恰当的解决办法。2. 单例模式实现Singleton.cpp#include "Singleton.h"#include <iostream>std::weak_ptr<CSingleton> CSingleton::m_instance;int CSingleton::num = 10;CSingl原创 2021-09-28 10:24:42 · 141 阅读 · 0 评论 -
【C++提高】 工厂模式
工厂模式包括三种:简单工厂模式、工厂方法模式、抽象工厂模式。1. 简单工厂模式设计思想:是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的 virtual 函数得到不同的结果,只抽象产品,不抽象工厂简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一类产品类(这些产品类继承自一个父类或接口)的实例。打个比方,假设有一个工厂,他能生产出BENZ、BMW、AUDI三种汽车。当客户需要产品的时候一定要告诉工厂是哪种产品,是三种车型中的哪一种。当新增加一种新产品的时候,那么就要去修改原创 2021-07-27 16:41:52 · 165 阅读 · 0 评论