C/C++
文章平均质量分 68
彷徨而立
这个作者很懒,什么都没留下…
展开
-
关于 std::map 的在遍历循环中 auto& 和 auto 的区别
std::map 的一些使用技巧原创 2023-08-31 10:03:38 · 463 阅读 · 0 评论 -
介绍 std::vector 的 operator[]
操作符只能访问指定的元素operator[]返回对指定位置的元素的引用。不执行边界检查。与不同,此运算符从不向容器中插入新元素。通过此运算符访问不存在的元素是未定义的行为。原创 2023-05-12 15:59:50 · 316 阅读 · 1 评论 -
介绍 std::map 的 operator[]
返回对映射到与键等效的键的值的引用,原创 2023-05-12 15:37:27 · 243 阅读 · 0 评论 -
简单读写文件函数
工作中常常要在程序中,用指令开启 读文件测试 或 写文件测试,比如说读指定文件数据用于播放,或将采集数据保存下来!原创 2022-09-26 14:51:29 · 176 阅读 · 0 评论 -
C语言【隐式类型转换】和【显式类型转换】
C语言是一种强类型语言,当使用一种类型代替另外一种类型进行操作时或者存在两个不同类型的对象进行操作时,首先就得进行类型的转换然后再说其他。而类型转换的方式一般可分为隐式类型转换(也称:自动类型转换)和显示类型转换(也称:强制类型转换),两者有着本质上的区别。隐式类型转换是由编译器自动进行的,不需要人为的干预,而且我们也观察不到类型是如何进行转换的,所以被称为:“ 隐式 ”。而显式类型转换是由程序员明确指定的,所以才被称为:“ 强制类型转换 ”。原创 2022-09-16 14:14:12 · 3057 阅读 · 0 评论 -
设置软件有效许可期(设置截止时间)
一些软件经常有许可使用期限,到了某个时间就会过期,软件就不能正常使用了!那么如何增加一个设置软件过期时间的功能呢?原创 2022-07-24 18:11:17 · 4476 阅读 · 0 评论 -
比memcpy更快的内存拷贝
偶然间看到一个叫xmemcpy的工具,用做内存拷贝。号称在拷贝120字节以内时,比glibc提供的memcpy快10倍,并且有实验数据。这让人感觉很诧异。一直以来都觉得memcpy是很高效的。相比于strcpy等函数的逐字节拷贝,memcpy是按照机器字长逐字进行拷贝的,一个字等于4(32位机)或8(64位机)个字节。CPU存取一个字节和存取一个字一样,都是在一条指令、一个内存周期内完成的。显然,按字拷贝效率更高。那么,这个xmemcpy是靠什么来实现比memcpy“快10倍”的呢?...转载 2022-07-04 09:45:53 · 934 阅读 · 0 评论 -
snprintf用法和注意
snprintf 用法和注意原创 2022-06-17 15:25:40 · 1102 阅读 · 0 评论 -
strncpy 用法注意
strncpy 用法和注意原创 2022-06-17 14:26:22 · 534 阅读 · 0 评论 -
vsnprintf 与 _vsnprintf 的区别
vsnprintf 与 _vsnprintf 的区别原创 2022-06-17 10:44:36 · 695 阅读 · 0 评论 -
多个线程一起创建时,某些线程的线程函数参数被篡改
公司某个程序需要在启动时创建多个线程,我们使用for循环来一起创建,结果某些期望的线程一直创建不成功!关键代码如下:enum en_TaskId{ TaskId_AudCap = 0, TaskId_AudPly, TaskId_AudTest, TaskId_AudMsg, TaskId_AudSrpAndBeam, AudioTaskNum = 5};// 创建 5 个线程void create_thread(){ pthread_t thread; for(u32原创 2022-02-28 10:50:44 · 534 阅读 · 0 评论 -
C++单例模式(线程安全、内存释放)
一、懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例。需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety.使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈。1、静态成员实例的懒汉模式:class Singleton { private: static Singleton* m_instance; Sin原创 2021-07-22 14:29:59 · 1467 阅读 · 3 评论 -
C/C++ 内存对齐(一):结构体
内存管理是C/C++编程非常重要的一部分内容,熟悉C/C++中一些常见数据结构和数据类型的内存分布情况,可以很大程度上降低了coding过程中内存泄漏和越界等比较严重的内存问题,下面主要讨论一下结构体(类中同样存在内存对齐,内存对齐会复杂一些,涉及到虚表等问题,后面介绍类的时候会提到)中的内存对齐问题。原创 2020-11-30 17:27:29 · 319 阅读 · 0 评论 -
va_start 用法
1. 在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表void foo(...);void foo(parm_list,...);这种方式和我们以前认识的不大一样,但我们要记住这是C中一种传参的形式,在后面我们就会用到它。2. 函数参数的传递原理函数参数是以数据结构:栈的形式存取,从右至左入栈。首先是参数的内存存放格式:参数存放在内存的堆栈段中,在执行函数的时候,从最后一个开始入栈。因此栈底高地址,栈顶低地址,举个例子如下:void func(int x, fl原创 2020-11-10 14:41:14 · 6201 阅读 · 1 评论 -
大小端(网络字节序)等概念
1.大小端定义大端存储模式:是指数据的低位字节序保存在内存的高地址中,而数据的高位字节序保存在内存的低地址中小端存储模式:是指数据的低位字节序保存在内存的低地址中,而数据的高位字节序保存在内存的高地址中例如:16bit宽的数0x0001在CPU内存中的存放方式(假设从地址0x4000开始存放)为:内存地址0x40000x4001存储内容(大端)0x000x01存储内容(小端)0x010x00大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保原创 2020-11-03 09:37:53 · 8124 阅读 · 0 评论 -
C++ 初始化列表
何谓初始化列表与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。在C++中,struct和class的唯一区别是默认的访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示。struct foo{ string name ; int id ; foo(string s, int i):name(s), id(i){} ; // 初始化列表};构造函数的两个执行阶段转载 2020-10-13 15:49:47 · 133 阅读 · 0 评论 -
C++ 初始化列表
初始化列表是啥?构造函数初始化列表以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个数据成员后面跟一个放在圆括号中的初始化式。构造函数初始化式只在构造函数的定义中而不是声明中指定。struct foo{ string name; int id; foo(string s, int i):name(s), id(i){} ; // 初始化列表};用class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下,struct的成员为public,而class的成员为pr转载 2020-10-13 14:19:34 · 141 阅读 · 0 评论 -
C/C++程序内存的各种变量存储区域和各个区域详解
C语言在内存中一共分为如下几个区域,分别是:1. 内存栈区: 存放局部变量名;2. 内存堆区: 存放new或者malloc出来的对象;3. 常数区: 存放局部变量或者全局变量的值;4. 静态区: 用于存放全局变量或者静态变量;5. 代码区:二进制代码。知道如上一些内存分配机制,有助于我们理解指针的概念。C/C++不提供垃圾回收机制,因此需要对堆中的数据进行及时销毁,防止内存泄漏,使用free和delete销毁new和malloc申请的堆内存,而栈内存是动态释放。全局变量、静态局.原创 2020-09-27 14:44:23 · 3603 阅读 · 0 评论 -
const、static变量存放位置
我们将以下面的例子介绍const变量和static变量的存放位置:static int val_a = 1 ; // 初始化的静态变量 static int val_b ; // 未初始化的静态变量 int val_c = 2 ; // 全局变量 int val_d ; // 未初始化的全局变量const int val_e = 3 ; // const 全局变量 int main(){ static int val_f =原创 2020-08-28 14:11:13 · 1366 阅读 · 0 评论 -
CreateThread与_beginthreadex本质区别
本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beginthreadex到底有什么区别,在实际的编程中到底应该使用CreateThread还是_beginthreadex?使用多线程其实是非常容易的,下面这个程序的主线程会创建了一个子线程并等待其运行完毕,子线程就输出它的线程ID号然后输出一句经典名言——Hello World。整个程序的代码非常...转载 2020-06-08 15:28:52 · 164 阅读 · 0 评论 -
C++智能指针
内存管理是C++中的一个常见的错误和bug来源。在大部分情形中,这些bug来自动态分配内存和指针的使用:当多次释放动态分配的内存时,可能会导致内存损坏或者致命的运行时错误;当忘记释放动态分配的内存时,会导致内存泄露。所以,我们需要智能指针来帮助我们管理动态分配的内存。其来源于一个事实:栈比堆要安全的多,因为栈上的变量离开作用域后,会自动销毁并清理。智能指针结合了栈上变量的安全性和堆上变量的灵活性。引言考虑下面一个函数:void someFunction(){ Resource* ptr =原创 2020-06-04 10:32:39 · 207 阅读 · 0 评论 -
从4行代码看右值引用
概述 右值引用的概念有些读者可能会感到陌生,其实他和C++98/03中的左值引用有些类似,例如,c++98/03中的左值引用是这样的:int i = 0;int& j = i; 这里的int&是对左值进行绑定(但是int&却不能绑定右值),相应的,对右值进行绑定的引用就是右值引用,他的语法是这样的A&&,通过双引号来表示绑定类型为A的右值。通过&&我们就可以很方便的绑定右值了,比如我们可以这样绑定一个右值:int&&a转载 2020-06-03 16:41:15 · 176 阅读 · 0 评论 -
浅谈 C++ 中的 new/delete 和 new[]/delete[]
在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢?new 和 delete 是函数吗? new [] 和 delete [] 又是什么?什么时候用它们? 你知道 operator new 和 operator delete 吗? 为什么 new [] 出来的数组有时可以用 delete 释放有时又不行? …如果你对这些问题都有疑问的话,不妨看看我这篇文章。new 和 delete 到底是什么?如果找工作的同学看一些面试的书,我相信都转载 2020-05-29 16:50:42 · 437 阅读 · 0 评论 -
C/C++宏定义中可变参数 __VA_ARGS__ 的理解
用可变参数宏(variadic macros)传递可变参数表你可能很熟悉在函数中使用可变参数表,如:void printf(const char* format, ...);一直以来,可变参数表还是只能应用在真正的函数中,不能使用在宏中。C99编译器标准终于改变了这种局面,它允许你可以定义可变参数宏(variadic macros),这样你就可以使用拥有可以变化的参数表的宏。可...原创 2020-03-13 13:26:06 · 7421 阅读 · 2 评论 -
C++引用(Reference)
引用(Reference)是C++语言相对于C语言的又一个扩充,类似于指针,只是在声明的时候用&取代了*。引用可以看做是被引用对象的一个别名,在声明引用时,必须同时对其进行初始化。...转载 2020-01-09 11:00:41 · 1253 阅读 · 0 评论 -
C语言stat()函数:获取文件状态
C语言stat()函数:获取文件状态相关函数:fstat, lstat, chmod, chown, readlink, utime头文件:#include<sys/stat.h> #include<uninstd.h>定义函数:int stat(const char * file_name, struct stat *buf);函数说明:stat(...转载 2019-02-22 15:28:03 · 12531 阅读 · 0 评论 -
lib 和 dll 的区别、生成以及使用详解
【目录】lib dll介绍生成动态库调用动态库生成静态库调用静态库 首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直...转载 2018-07-18 15:19:00 · 137 阅读 · 0 评论 -
基类指针指向子类对象
没有指定虚函数, 那么它就只能访问到类型对应的函数基类指针就只能访问到基类函数子类指针就只能访问到子类函数要使用基类访问到子类的函数, 最符合常规的, 就是虚函数了.当然, 你也可以使用非常规的, 比如强制转换, 比如自己计算函数地址并调用.正常情况,子类祖先类的析构函数都是虚拟的,这样删除祖先类指针、子类对象的时候,可正确同时调用子类和祖先类的析构函数):#include <iost...转载 2018-07-03 10:10:44 · 13725 阅读 · 1 评论 -
结构体字节对齐
在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。 内存对齐的原因: 1)某些平台只能在特定的地址处访问...转载 2018-06-08 11:00:22 · 125 阅读 · 0 评论 -
printf 打印颜色
控制字符的通用格式如下:Esc[{attr1};...;{attrn}m其中:Esc 是转义字符, 其值为"\033";[ 是常量的左中括号;{attr1};...{attrn} 是若干属性, 通常是由一个有特定意义的数字代替, 每个属性之间用分号分隔;m 就是字面常量字符m;属性列表如下:1. 通用格式控制:0 重置所有属性1 高亮/加粗2 暗淡4 下划线5 闪烁7 反转8 隐藏2. 前景色:3...转载 2018-05-29 10:39:02 · 3597 阅读 · 2 评论