
C++学习
文章平均质量分 55
美丽的欣情
3年C++音视频工作经验、1年Qt界面开发经验
展开
-
《Effective c++》记录
const替换#define,const作为变量更能让编译器看见,从而加入记号表(symbol table),出现错误时可以更好查找出问题出处,加入了记号表则提示为a错误信息,未加入则提示5为错误信息。1、将某些东西声明为const可以帮助编译器侦测出错误用法,const可用于任何作用域的对象、函数参数、函数返回类型、成员函数本体;3、当const和non-const成员函数拥有实质相等的实现时,应该令non-const版本调用-const版本避免代码重复。原创 2023-05-08 10:22:36 · 12884 阅读 · 0 评论 -
Lambda表达式
lambda 表达式是一种在代码中直接创建匿名函数(即没有名称的函数)的方法。它们特别适用于需要传递给算法或事件处理器的简短、一次性使用的函数。原创 2024-08-23 17:07:32 · 522 阅读 · 0 评论 -
C++20特性-------std::span
std::span是一个轻量级的视图类型,用于表示一段连续的内存区域。它不拥有数据,而是提供对现有数组、容器或内存区域的非拥有(non-owning)视图。允许你在不复制数据的情况下处理这些数据。std::span是一个非常有用的工具,特别是在需要处理连续内存块而又不想复制数据的情况下。它提供了更好的安全性和代码可读性,使得处理数组和容器变得更加方便和直观。原创 2024-08-23 17:01:48 · 470 阅读 · 0 评论 -
C++锁(互斥、递归、读写、条件)
在 C++ 中,锁是用于同步线程对共享资源的访问,以防止数据竞争和不一致的问题。C++ 标准库提供了几种用于线程同步的锁机制,主要包括互斥锁 (std::mutex)、递归互斥锁 ()、读写锁 ()、以及条件变量 () 等。原创 2024-08-01 17:24:44 · 350 阅读 · 0 评论 -
C++线程同步
线程同步是指确保多个线程按特定顺序执行或访问共享资源时不会发生冲突的技术。线程同步的主要目的是避免数据竞争和保证操作的原子性,以确保程序的正确性和一致性。1.互斥量用于保护对共享资源的访问,以确保同一时间只有一个线程可以访问该资源。C++中提供了std::mutex类来实现互斥量。2.条件变量用于让线程等待某个条件成立后再继续执行。它通常与互斥量一起使用,线程可以在条件变量上等待,直到另一个线程通知它条件已满足。3.读写锁允许多个线程同时读取共享资源,但在写入资源时会阻止其他线程的读取和写入。原创 2024-07-30 14:35:02 · 257 阅读 · 0 评论 -
超详细进程间通信
进程间通信(Inter-Process Communication, IPC)是指不同进程之间进行数据交换和同步的机制。常见的进程间通信方法包括:下方有附代码示例每种方法都有其适用的场景和特点,选择合适的进程间通信方法取决于应用程序的需求和设计。原创 2024-07-30 11:43:44 · 680 阅读 · 0 评论 -
time_t类型unix时间戳转换
反之可以使用 localtime_r 函数将unix时间戳转换为结构体;所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数(头文件中有一个结构体,可以保存所有的年、月、日、时、分、秒等相关信息。),发生错误时返回-1。原创 2024-06-21 11:38:36 · 439 阅读 · 0 评论 -
libsndfile使用示例
二、从本地打开wav文件并读取pcm数据。三、从缓存中读取pcm数据。原创 2024-05-23 16:09:10 · 765 阅读 · 0 评论 -
对PCM数据进行重采样
其实重采样的真正原因是这样的,在我们进行音视频开发中,遇到的很多设备的对于音频的格式要求是不一样的。为何需要进行重采样呢?原创 2024-05-16 15:41:10 · 424 阅读 · 0 评论 -
Google 开源项目风格指南
谷歌C++开源项目编码规范:原创 2024-05-07 14:45:21 · 249 阅读 · 0 评论 -
C++代码eSpeak库使用示例
要将 eSpeak 库生成的 PCM 数据转换为 WAV 格式并保存,你可以使用 C++ 的标准文件操作来创建 WAV 文件,并将 PCM 数据写入其中。部分为 eSpeak 生成的实际 PCM 数据。这段代码假设输入的 PCM 数据是单声道、16位的。函数生成 PCM 数据。然后,我们将这些 PCM 数据写入 WAV 文件,并在最后使用。函数用于将 PCM 数据写入 WAV 文件。在函数中,首先构建了 WAV 文件头(结构体),然后将其写入文件,接着将 PCM 数据写入文件。在这个示例中,我们首先使用。原创 2024-04-01 11:19:38 · 744 阅读 · 0 评论 -
htonl()、htons()、ntohl()、ntohs()四个函数
htons 是把你机器上的整数转换成“网络字节序”, 网络字节序是 big-endian,也就是整数的高位字节存放在内存的低地址处。htons 的用处就是把实际内存中的整数存放方式调整成“网络字节序”的方式。这些函数在不同的操作系统上可能会有一些细微的差别,但它们的目的都是为了处理网络数据的字节顺序转换,以确保在不同的主机上进行网络通信时能够正确解释数据的顺序。主机字节顺序指的是在特定主机体系结构上整数的字节表示方式,而网络字节顺序是一种固定的大端字节顺序,用于在不同主机之间进行通信。原创 2024-01-03 10:25:06 · 3847 阅读 · 5 评论 -
jsoncpp库输出浮点型值精度错误
这是因为 21/100 没有精确的浮点表示,默认情况下,我们使用17位数字,因为这是将double的任何值明确表示为字符串所需的数字。这与15==DBL_DIG==std::numeric_limits<double>::digitals10不同,后者是可以在不失真的情况下从字符串解析到double并返回的最大位数。我们选择了足够多的数字来完美地表示每一个可能的双精度值。所以只需要15位数字的精度,因为15位数字可以在不失真的情况下解析和重新打印,但这会牺牲对double数据类型的完整尾数的访问。原创 2023-12-13 15:17:48 · 920 阅读 · 0 评论 -
string转int函数(stoi)
而 atoi 是一个传统的 C 函数,它不会抛出异常,而是在转换失败时返回 0。另外,atoi 并不支持处理带有正负号的字符串,需要额外的处理逻辑来应对这种情况。,除非在非常频繁地进行字符串到整数的转换,在大规模数据处理或性能要求非常高的场景下,可以考虑使用 atoi 作为一种性能优化的选择。但是需要注意的是,优化性能的同时也要考虑到可靠性和安全性的因素,及时处理转换错误和异常情况。异常,这样我们可以在代码中捕获并处理这些异常。而且,stoi 还能处理带有正负号的字符串,能够更方便地转换带有符号的整数。原创 2023-08-25 15:37:35 · 964 阅读 · 0 评论 -
C++获取map最小值算法,STL---std::min_element()!
这些重载仅若 std::is_execution_policy_v (C++20 前)std::is_execution_policy_v (C++20 起) 为 true 才参与重载决议。comp - 比较函数对象(即满足比较 (Compare) 要求的对象),若a 小于 b ,则返回 true。寻找范围 [first, last) 中的最小元素。原创 2023-08-23 10:16:53 · 813 阅读 · 0 评论 -
编译osip2与eXosip2静态库,一文搞定!
添加osipparser2/ 与osip2/再编译。原创 2023-04-14 11:35:32 · 687 阅读 · 0 评论 -
查看linux中程序是否被系统杀死,如何查看日志
最近在linux开发日常中,维护之前发布的程序,几台服务器只有一台在重启,而且不定期,查看服务日志也没有任何signal信号以及服务挂掉的原因打印,迫于无奈怀疑是linux系统给服务干掉了。于是想查看服务被杀掉的日志,看看系统日志,即可判断。即途中目录下的messages文件,通过命令即可过滤信息查看是否被系统killed。用以下命令查看系统日志信息!命令输出如下:参数解析:total-vm: total virtual memory. 进程使用的总的虚拟内存。原创 2023-03-06 11:35:00 · 6370 阅读 · 0 评论 -
脚本一键打包linux服务ldd依赖库
ldd不是一个可执行程序,而只是一个shell脚本 ldd能够显示可执行模块的dependency(所属)(所属),其原理是通过设置一系列的环境变量,如下:LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE等。我们知道,ld-linux.so模块会先于executable模块程序工作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so选择了显示可执行模块的dependency(所属)。原创 2023-03-01 11:26:11 · 827 阅读 · 0 评论 -
C++智能指针学习
本人参考的是夏之七的C++智能指针详解:C++智能指针详解_夏之七的博客-优快云博客_c++智能指针1、概述我们知道除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们。在C++中,动态内存的管理是用一对运算符完成的:new和delete。new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针;delete:指向一个动态独享的指针,销毁对象,并释放与之关联的翻译 2022-05-09 17:27:20 · 272 阅读 · 0 评论 -
C++exit()函数无法结束进程
exit()函数与_exit()函数最大的区别就在于 exit()函数在调用 exit 系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件。如果程序使用_exit()来结束进程,则不会进行I/O缓存清理,会结束进行。但是_exit()函数直接将进程关闭,缓冲区的数据将会丢失。程序如果写了处理signal信号的函数,那么可能会引起捕捉信号导致无法结束进程,程序进入一种无法结束状态,一直打印堆栈信息。如果程序使用exit()来结束进程,那么在结束前会进行清理I/O缓存的操作,不会立马结束。原创 2023-02-03 16:28:09 · 1850 阅读 · 0 评论