C/C++
文章平均质量分 80
语言是工具而已。
Black.Spider
宝剑锋从磨砺出,梅花香自苦寒来
展开
-
C++内存对齐
通常情况下,cpu取数据是按照内存单元取的,而内存单元的地址是对齐的。这就意味着,内存对齐的情况下,cpu取某个地址上的数据(它存储在某个内存单元),只需要取一次即可。这里有一个原则,就是尽量将对齐字节数大的成员声明在前面,从而减少内存对齐时,带来额外的内存开销。c的偏移地址是9,但c要按照2字节对齐,所以要填充一个字节,也就是x所占的位置,因此,c的偏移地址变成了10,可以对齐。对于类或者结构体的对齐,首先考虑内部各变量自身的对齐,其次再考虑类作为一个整体,也需要按照最大的数据成员去对齐。原创 2024-07-17 23:04:06 · 482 阅读 · 0 评论 -
C++中的string类操作详解
针对C++中的string,本文主要讲解如何对其进行插入、删除、查找、比较、截断、分割以及与数字之间的相互转换等。原创 2024-04-08 17:44:23 · 2042 阅读 · 1 评论 -
C++缺陷与思考
很明显,我对C++的思考仅限于C++语言本身,至于其他语言我很少涉及,因此,不能够通过与其他语言的对比中,发现C++更多的不足。因为不知道别人有多好,所以我总以为C++给予我的就是它最好的,但事实上它也有很多缺陷。当然,一切相遇都是最好的安排,既然选择了C++,那它就是最好的,不忘初心(学好C++),方得始终。原创 2024-02-29 17:58:38 · 465 阅读 · 1 评论 -
extern与static的区别与使用
当其他源文件包含该头文件时,会产生一个新的内存来存储静态的全局变量,即不与其他文件共享该变量。原创 2024-02-27 11:39:46 · 430 阅读 · 0 评论 -
C++中如何获取虚表和虚函数的地址
funcB_addr2:将vtable_addr + sizeof(intptr_t),先强转为指向虚函数地址的指针,再解引用,即得到第二个虚函数的地址,对于32位系统sizeof(intptr_t)的值为4,64位系统则等于8。funcB_addr就类似p1,funcB_addr2类似于p1_2,virtual_func_ptr类似于p,vtable_addr类似于addr,虚函数地址即为元素,每个元素占sizeof(intptr_t)个字节。本文主要讨论如何获取。原创 2023-11-08 17:32:25 · 572 阅读 · 0 评论 -
【C++】使用 nlohmann 解析 json 文件
当然也可以通过捕获异常的方式来达到避免程序出错的目的,注意由于doc[“retMSg”]这种访问方式不能抛出异常,应该使用doc.at(“retMSg”)这种方式来访问。通过数组的方式访问某个key也是会抛出异常的,只是它不能准确定位异常的位置,但是通过at方法是可以定位到具体异常的(如果访问的key不存在)。里面的每一对花括号的第一个元素为key,第二个元素为value,用’,'分割。{{1, 2}}是一个object,即{1:2},key为1,value为2。易于集成,仅需一个头文件,无需安装依赖。原创 2023-08-30 10:18:44 · 4361 阅读 · 1 评论 -
read和fread的区别与使用
read函数原型:ssize_t read(int fd ,void *buf, size_t count);read用于从文件描述符对应的文件读取数据,调用成功返回读出的字节数;buf为读出数据的缓冲区,count为每次读取的字节数,出错返回-1,结束返回0。fread函数原型:size_t fread(void *ptr,size_t size,size_t n,FILE *stream);ptr为指向缓冲区保存或读取的数据size为控制记录大小。n为记录数。函数返回读取或回写的记录数,原创 2020-08-13 21:41:54 · 741 阅读 · 0 评论 -
C/C++中整数加法/减法的溢出问题
C/C++中的整数类型有short、int、long等,这些整数类型均为有符号整型,即二进制最高位位符号位,相应的无符号整型只需要在各类型前面加上unsigned,如unsigned int等。现在有如下程序,其输出结果会是多少呢?short x = 0x7fff;short y = x + 2;short z = y - 2;unsigne...原创 2020-01-31 23:09:46 · 3893 阅读 · 0 评论 -
基于hiredis的发布-订阅模式实现
概述发布-订阅模式,又称观察者模式。在本文的实现中,观察者Service订阅感兴趣的通道,而redis客户端则向通道中发布消息,当订阅的通道有消息到来时,循环等待的线程就会给Service发出通知,并调用处理函数进行消息的处理(输出)。代码实现基于hiredis的发布和订阅代码下面只给出了代码的头文件,具体实现见github仓库。#ifndef REDIS_H#define REDIS_H#include <hiredis/hiredis.h>#include <thre原创 2020-06-27 20:40:21 · 2002 阅读 · 1 评论 -
C++对象池自动回收技术
什么是对象池 类似于内存池机制,对象池中存放有已经分配好的对象,当需要使用时,只需要向对象池申请。而不再使用时,则由对象池自动回收。适用于一下情况:对象可重用对象创建开销大对象创建频繁如何实现自动回收 C++11中的智能指针可以自定义删除器,在回收时智能指针自动调用自定义的删除器实现对象的自动回收。那么何时定义删除器呢?如果我们在添加对象时定义删除器,那么对象被回收后就失去了自定义的删除器。因此我们可原创 2020-06-24 23:51:45 · 908 阅读 · 0 评论 -
C++中的异常处理
异常处理的基本语法try {/*代码块*/}catch (/*异常类型*/) {/*处理异常*/ }...catch (/**异常类型/) {/*处理异常*/} 至少有一个catch块,当try块中的代码执行没有出现异常,则跳过所有catch块继续执行;否则从第一个catch块匹配合适的异常类型后进入catch块中进行异常处理。如: int a = 10, b = 0; try { if (b == 0) throw 1; //抛原创 2020-06-24 22:32:57 · 325 阅读 · 0 评论 -
C++11新特性
最近工作中,遇到一些问题,使用C++11实现起来会更加方便,而线上的生产环境还不支持C++11,于是决定新年开工后,在组内把C++11...转载 2020-03-31 23:16:58 · 148 阅读 · 0 评论 -
C++内存管理
C++内存管理 原创 ...转载 2020-03-27 20:43:32 · 278 阅读 · 0 评论 -
sizeof使用误区
sizeof的作用,可用来求数据类型的大小,包括内置类型和自定义类型等,如下所示:typedef struct node { int val; int lnode; int rnode; int parent;}NODE;char a[10];printf("%d %d %d\n", sizeof(int), sizeof(a), s...原创 2019-12-25 11:35:47 · 140 阅读 · 0 评论 -
C++中的转义与转义字符
常见的转义字符见下表。转义字符ascii码意义\a007响铃\b008退格\f012换页\n010换行\r013回车\t009水平制表\v011垂直制表\\092反斜杠\?063问号字符\’039单引号\"034双引号...原创 2020-01-21 22:42:39 · 1504 阅读 · 0 评论 -
C中的qsort函数和C++中的sort函数的理解与使用
一、qsort函数1.1函数介绍 原型:_CRTIMP void __cdecl qsort(void*, size_t, int()(const void, const void*)); 参数:第一个参数为待排序数组首地址;第二个参数为数组元素个数;第三个参数为每个元素所占空间;第四个参数为函数指针...原创 2020-01-28 16:24:41 · 169 阅读 · 0 评论 -
for循环中scanf方法
#include <stdio.h>int main (void){char a, b;puts (“请输入一个整数”);scanf ("%c", &a);puts (“再输入一个整数”);scanf ("%c", &b);printf (“a = %c b = %c\n”, a, b);return 0;}上述程序运行过程中,输入第一个整数后,再...原创 2020-03-27 15:19:56 · 8749 阅读 · 0 评论