
C/C++
文章平均质量分 70
彷徨而立
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【OpenCL】内存越界导致错误
使用 Y=0, U=128, V=128 测试下来处理后的nv12 图片 Y分量正常,UV 分量值异常,UV值排布如下:处理后的 nv12 图像如下,并不是预期的 纯黑图像。原创 2025-07-08 14:16:02 · 269 阅读 · 0 评论 -
【OpenCL】未考虑到运算符优先级,导致的错误
上述kernel函数是用于NV12图片填充指定颜色color(一次填充横向8像素),但是测试发现,只填充了 Y 分量,未成功填充 UV 分量。后就成功填充了 UV 分量了。OpenCL/C/C++ 中,原创 2025-07-08 09:47:43 · 379 阅读 · 0 评论 -
【C/C++】创建文件夹
在 C/C++ 中,在指定目录下创建。根据项目需求选择合适的方法!原创 2025-06-12 09:55:46 · 491 阅读 · 0 评论 -
【C】位运算
位运算直接对整数的二进制位(bit)进行操作,常用于底层开发、硬件编程、数据压缩、加密算法等场景。掌握位运算可以显著提升代码在底层和高性能场景的效率,但需注意可读性和平台兼容性。注意:位域的具体内存布局依赖编译器实现,跨平台时需谨慎。注意:右移负数的结果依赖编译器实现(算术/逻辑右移)。原创 2025-05-30 13:52:34 · 928 阅读 · 0 评论 -
【C】perror() 函数详解
是 C 标准库中的一个函数,用于将当前 值对应的错误信息打印到标准错误输出(stderr)。它比手动使用 更方便,因为它自动处理了格式化和输出。功能描述读取当前线程的 值查找对应的错误描述字符串(相当于 )将输出格式化为:将结果输出到标准错误流(stderr)使用示例基本用法对比 strerror参数说明: 用户自定义的前缀字符串如果为 NULL,则只打印错误描述如果为空字符串(“”),行为与 NULL 相同通常用于说明是哪个操作失败了特点自动使用当前原创 2025-05-07 10:01:06 · 1237 阅读 · 0 评论 -
【C/C++】errno/strerror 和 GetLastError()/FormatMessage 的区别
这行代码用于在 C 语言中输出系统错误信息,但它与 Windows 的 有重要区别。下面我将详细解释每个部分及其工作原理。3. 与 Windows API 的区别特性errno/strerrorGetLastError()/FormatMessage来源标准 C 库函数设置Windows API 函数设置头文件<errno.h>, <string.h><windows.h>错误码范围标准 C 定义的错误码Windows 系统错误码线程安全现代实现原创 2025-05-07 09:59:53 · 768 阅读 · 0 评论 -
【C++】频繁分配和释放会产生内存碎片
在C++中,频繁地进行动态内存分配和释放确实会导致问题,这会影响程序性能和稳定性。原创 2025-04-30 17:03:17 · 1016 阅读 · 0 评论 -
【C++】频繁进行动态内存分配和释放可能导致多方面的问题
通过合理选择策略,可将动态内存管理的开销降低。:分析堆内存使用趋势。原创 2025-04-30 17:01:38 · 850 阅读 · 0 评论 -
【C++】虚析构函数的继承
都是虚拟类:A、B、C 都具有多态性(因为继承链中有虚析构函数)析构顺序:C → B → A(从最派生到基类)最佳实践:如果一个类可能被继承,应该声明虚析构函数析构函数是否为虚函数?原因~A()是显式声明为virtual~B()是继承自A的虚析构函数,自动成为虚函数(override只是显式标注)~C()是继承自B(间接继承A的虚析构函数),自动成为虚函数最佳实践:始终为基类声明虚析构函数,并在派生类中使用override明确意图。原创 2025-04-18 13:47:20 · 614 阅读 · 0 评论 -
【C】结构体初始化方法
这些方法覆盖了大多数实际开发场景,根据项目需求选择合适的初始化方式。原创 2025-04-08 14:52:59 · 1313 阅读 · 0 评论 -
【C】localtime_r、localtime_s、localtime 三者的区别
和localtime都是用于将time_t转换为本地时间struct tm的函数,但它们在和localtime。原创 2025-04-08 14:44:33 · 1069 阅读 · 0 评论 -
【C++】基于范围的for循环(range-based for loop)
在 C++ 中, 是一个动态数组,用于存储同类型元素的序列。当你向 中添加元素时(通常通过 方法),元素是按照你添加它们的顺序排列的。具体来说:顺序添加:每次调用 或其他插入方法(如 )时,新元素会被添加到 的末尾。因此, 中的元素顺序与你添加它们的顺序一致。内存布局: 在底层通常使用连续的内存块来存储元素,这意味着所有元素在内存中是连续排列的。这与链表等数据结构不同,链表中的元素在内存中不一定是连续的。性能考虑:当 的容量不足以容纳新元素时,它会自动分配一个更大的内存块,并将现有元素复制到新的内原创 2025-03-04 17:14:15 · 742 阅读 · 0 评论 -
【C++】switch 语句编译报错:error: jump to case label
switch这个错误是由于switch语句中局部变量的作用域问题导致的。通过限制局部变量的作用域、将变量定义移到switch之前,或者使用if-else替代switch,都可以解决这个问题。推荐使用方法 1,因为它既保持了代码的清晰性,又避免了潜在的错误。原创 2025-03-04 13:57:24 · 441 阅读 · 0 评论 -
双缓冲结构(满队列和空队列)
帧缓冲设计——双缓冲结构(满队列和空队列)原创 2024-11-07 17:26:29 · 269 阅读 · 0 评论 -
关于 std::map 的在遍历循环中 auto& 和 auto 的区别
std::map 的一些使用技巧原创 2023-08-31 10:03:38 · 744 阅读 · 0 评论 -
介绍 std::vector 的 operator[]
操作符只能访问指定的元素operator[]返回对指定位置的元素的引用。不执行边界检查。与不同,此运算符从不向容器中插入新元素。通过此运算符访问不存在的元素是未定义的行为。原创 2023-05-12 15:59:50 · 436 阅读 · 1 评论 -
介绍 std::map 的 operator[]
返回对映射到与键等效的键的值的引用,原创 2023-05-12 15:37:27 · 350 阅读 · 0 评论 -
简单读写文件函数
工作中常常要在程序中,用指令开启 读文件测试 或 写文件测试,比如说读指定文件数据用于播放,或将采集数据保存下来!原创 2022-09-26 14:51:29 · 208 阅读 · 0 评论 -
C语言【隐式类型转换】和【显式类型转换】
C语言是一种强类型语言,当使用一种类型代替另外一种类型进行操作时或者存在两个不同类型的对象进行操作时,首先就得进行类型的转换然后再说其他。而类型转换的方式一般可分为隐式类型转换(也称:自动类型转换)和显示类型转换(也称:强制类型转换),两者有着本质上的区别。隐式类型转换是由编译器自动进行的,不需要人为的干预,而且我们也观察不到类型是如何进行转换的,所以被称为:“ 隐式 ”。而显式类型转换是由程序员明确指定的,所以才被称为:“ 强制类型转换 ”。原创 2022-09-16 14:14:12 · 3523 阅读 · 0 评论 -
设置软件有效许可期(设置截止时间)
一些软件经常有许可使用期限,到了某个时间就会过期,软件就不能正常使用了!那么如何增加一个设置软件过期时间的功能呢?原创 2022-07-24 18:11:17 · 5646 阅读 · 0 评论 -
比memcpy更快的内存拷贝
偶然间看到一个叫xmemcpy的工具,用做内存拷贝。号称在拷贝120字节以内时,比glibc提供的memcpy快10倍,并且有实验数据。这让人感觉很诧异。一直以来都觉得memcpy是很高效的。相比于strcpy等函数的逐字节拷贝,memcpy是按照机器字长逐字进行拷贝的,一个字等于4(32位机)或8(64位机)个字节。CPU存取一个字节和存取一个字一样,都是在一条指令、一个内存周期内完成的。显然,按字拷贝效率更高。那么,这个xmemcpy是靠什么来实现比memcpy“快10倍”的呢?...转载 2022-07-04 09:45:53 · 1263 阅读 · 0 评论 -
snprintf用法和注意
snprintf 用法和注意原创 2022-06-17 15:25:40 · 1349 阅读 · 0 评论 -
strncpy 用法注意
strncpy 用法和注意原创 2022-06-17 14:26:22 · 646 阅读 · 0 评论 -
vsnprintf 与 _vsnprintf 的区别
vsnprintf 与 _vsnprintf 的区别原创 2022-06-17 10:44:36 · 831 阅读 · 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 · 609 阅读 · 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 · 1644 阅读 · 3 评论 -
C/C++ 内存对齐(一):结构体
内存管理是C/C++编程非常重要的一部分内容,熟悉C/C++中一些常见数据结构和数据类型的内存分布情况,可以很大程度上降低了coding过程中内存泄漏和越界等比较严重的内存问题,下面主要讨论一下结构体(类中同样存在内存对齐,内存对齐会复杂一些,涉及到虚表等问题,后面介绍类的时候会提到)中的内存对齐问题。原创 2020-11-30 17:27:29 · 372 阅读 · 0 评论 -
va_start 用法
1. 在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表void foo(...);void foo(parm_list,...);这种方式和我们以前认识的不大一样,但我们要记住这是C中一种传参的形式,在后面我们就会用到它。2. 函数参数的传递原理函数参数是以数据结构:栈的形式存取,从右至左入栈。首先是参数的内存存放格式:参数存放在内存的堆栈段中,在执行函数的时候,从最后一个开始入栈。因此栈底高地址,栈顶低地址,举个例子如下:void func(int x, fl原创 2020-11-10 14:41:14 · 6797 阅读 · 1 评论 -
大小端(网络字节序)等概念
1.大小端定义大端存储模式:是指数据的低位字节序保存在内存的高地址中,而数据的高位字节序保存在内存的低地址中小端存储模式:是指数据的低位字节序保存在内存的低地址中,而数据的高位字节序保存在内存的高地址中例如:16bit宽的数0x0001在CPU内存中的存放方式(假设从地址0x4000开始存放)为:内存地址0x40000x4001存储内容(大端)0x000x01存储内容(小端)0x010x00大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保原创 2020-11-03 09:37:53 · 8860 阅读 · 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 · 182 阅读 · 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 · 177 阅读 · 0 评论 -
C/C++程序内存的各种变量存储区域和各个区域详解
C语言在内存中一共分为如下几个区域,分别是:1. 内存栈区: 存放局部变量名;2. 内存堆区: 存放new或者malloc出来的对象;3. 常数区: 存放局部变量或者全局变量的值;4. 静态区: 用于存放全局变量或者静态变量;5. 代码区:二进制代码。知道如上一些内存分配机制,有助于我们理解指针的概念。C/C++不提供垃圾回收机制,因此需要对堆中的数据进行及时销毁,防止内存泄漏,使用free和delete销毁new和malloc申请的堆内存,而栈内存是动态释放。全局变量、静态局.原创 2020-09-27 14:44:23 · 3986 阅读 · 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 · 1534 阅读 · 0 评论 -
CreateThread与_beginthreadex本质区别
本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beginthreadex到底有什么区别,在实际的编程中到底应该使用CreateThread还是_beginthreadex?使用多线程其实是非常容易的,下面这个程序的主线程会创建了一个子线程并等待其运行完毕,子线程就输出它的线程ID号然后输出一句经典名言——Hello World。整个程序的代码非常...转载 2020-06-08 15:28:52 · 199 阅读 · 0 评论 -
C++智能指针
内存管理是C++中的一个常见的错误和bug来源。在大部分情形中,这些bug来自动态分配内存和指针的使用:当多次释放动态分配的内存时,可能会导致内存损坏或者致命的运行时错误;当忘记释放动态分配的内存时,会导致内存泄露。所以,我们需要智能指针来帮助我们管理动态分配的内存。其来源于一个事实:栈比堆要安全的多,因为栈上的变量离开作用域后,会自动销毁并清理。智能指针结合了栈上变量的安全性和堆上变量的灵活性。引言考虑下面一个函数:void someFunction(){ Resource* ptr =原创 2020-06-04 10:32:39 · 262 阅读 · 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 · 208 阅读 · 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 · 513 阅读 · 0 评论 -
C/C++宏定义中可变参数 __VA_ARGS__ 的理解
用可变参数宏(variadic macros)传递可变参数表你可能很熟悉在函数中使用可变参数表,如:void printf(const char* format, ...);一直以来,可变参数表还是只能应用在真正的函数中,不能使用在宏中。C99编译器标准终于改变了这种局面,它允许你可以定义可变参数宏(variadic macros),这样你就可以使用拥有可以变化的参数表的宏。可...原创 2020-03-13 13:26:06 · 8396 阅读 · 2 评论 -
C++引用(Reference)
引用(Reference)是C++语言相对于C语言的又一个扩充,类似于指针,只是在声明的时候用&取代了*。引用可以看做是被引用对象的一个别名,在声明引用时,必须同时对其进行初始化。...转载 2020-01-09 11:00:41 · 1299 阅读 · 0 评论 -
结构体字节对齐
在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。 内存对齐的原因: 1)某些平台只能在特定的地址处访问...转载 2018-06-08 11:00:22 · 160 阅读 · 0 评论