![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Common/Linux C/C++
Common/Linux C/C++
SleepyPat
化整为零
展开
-
[common c++] 为何纯虚父类可以在子类的构造函数初始化列表进行实例化
纯虚类(抽象类) 是只至少拥有一个纯虚函数的类,这种类可以有成员变量,但是不能进行单独的实例化(new,局部变量,智能指针构造等等)。其根本原因是由于纯虚类提供了未实现的成员函数,所以编译器无法知道如何处理这种悬空的成员函数符号表,就好像一个dangling function pointer一样,没有指向任何 .text section。所以一旦授权实例化形成实例,那么就会出现类似于访问悬垂指针的情况。因此是禁止实例化的。原创 2024-04-23 14:28:03 · 331 阅读 · 1 评论 -
[common c++] 关于虚函数表
25.6 — The virtual table – Learn C++原创 2024-02-06 10:54:27 · 588 阅读 · 0 评论 -
[Linux c] 关于进程名,线程名,/proc文件系统 等
【代码】[Linux c/c++] 关于进程名,线程名,/proc文件系统 等。原创 2024-01-04 11:34:50 · 700 阅读 · 0 评论 -
[linux c/c++] 通过读取 /proc 路径获取指定进程名的信息
【代码】[linux c/c++] 通过读取 /proc 路径获取指定进程名的信息。原创 2024-01-02 15:02:42 · 444 阅读 · 0 评论 -
[common c] 字符串处理函数 sscanf
sscanf函数详细介绍及使用方法解析-CSDN博客原创 2024-01-02 14:01:18 · 501 阅读 · 0 评论 -
[common c/c++] 为什么使用 semaphore 的生产者消费者模型需要两个信号量
一个信号量场景下,生产者在 post 信号的时候是没有束缚的,如果不控制生产量的话,会导致系统资源被耗尽。一种方法是判断 FIFO 的尺寸,如果 FIFO 已经满了,则停止本次生产,接着sleep一定时间等待消费者从队列中取走数据,然后判断队列是否为空或者是否降到一定阈值,如果满足则继续填充队列。这种方法有一个问题,那就是如果消费者突然间在短时间内把数据都取走了,那么生产者sleep的就是影响了效率,如果缩减sleep的周期,那么又会导致cpu升高。另外一种方法是使用两个信号量。原创 2023-12-12 17:16:45 · 389 阅读 · 0 评论 -
[common c/c++] ring buffer/circular buffer 环形队列/环形缓冲区
ring buffer/circular buffer 又名环形队列,其容量是固定的,当数据满的时候,新来的数据会覆盖最古老的数据,这种数据结构的特点是数据的写入不会因为队列满了而停止,同时也会导致旧数据的丢失,因此,常用在一些对老旧数据不敏感的场景。这种数据结构的主要用途不是高效的 lock free 生产者消费者模型,而是解决缓冲区固定大小的场景。当然,也可以设计程 lock free 的 ring buffer/circular buffer。原创 2023-10-31 11:27:24 · 419 阅读 · 2 评论 -
[Linux C] 信号signal 的使用
信号的创建有两套api,一个是signal,一个是sigaction,signal缺陷很多,比如没有提供触发后自动再次设置处理信号处理策略,这会导致连续触发的两个信号,一个进入了期待的信号处理流程,另外一个则进入了默认的信号处理流程。但是信号的递送可能会出现阻塞,这个阻塞发生在信号发送者把信号送入内核的信号队列中(需要从代码层面验证)。signal 是一种通信机制,可以跨进程发送,可以同进程跨线程发送,可以不同进程向指定线程发送。原创 2023-10-30 10:17:04 · 363 阅读 · 0 评论 -
[common c/c++] 使用 posix 共享内存 和 mmap 实现 inter process function call
mmap 可以映射某个文件的某块内存区域,因此可以通过 mmap 和 共享内存的方式将两个不同进程内的函数地址映射到共享内存里,以次实现跨进程的函数调用。正是通过mmap 把动态库文件 映射到当前进程的堆区域中实现的。实际上,linux 动态库的。原创 2023-10-24 16:49:15 · 89 阅读 · 0 评论 -
[Linux c/c++] futex
futex 是用户层面的 锁,使用futex 不会出现用户态到内核态的切换,因此应用程序中要比mutex快一点,如果是驱动程序和内核模块的话,就不要使用futex了,因为驱动和内核模块都运行再内核态,用mutex则更快一点。原创 2023-10-18 09:21:38 · 185 阅读 · 0 评论 -
[Common c/c++] 生产者消费者模型 using mutex/cv/semaphore
生产者消费者模型是老生常谈的话题,实现手段也是各种各样,不同的手段的 运行效率也是天壤之别。代码简洁度,数据安全性,运行稳定性,运行性能等等要素很难做到兼顾。原创 2023-10-12 11:18:29 · 207 阅读 · 1 评论 -
[common] IPC
IPC , 进程间通讯,是指进程间通过 ipc 组件进行通讯的方式。原创 2023-09-27 10:58:27 · 112 阅读 · 0 评论 -
[common c/c++] 常用的c++参考网站
C++ Cheat Sheets & Infographics | hacking C++原创 2023-08-29 13:36:01 · 201 阅读 · 0 评论 -
[Common c/c++] 可变参数列表
c标准库提供一套可变参数列表使用方法,va_list / va_start / va_arg / va_end。原创 2023-08-23 11:51:33 · 405 阅读 · 0 评论 -
[common c] 嵌套结构体中内层结构体的成员可以和外层结构体成员同名
glib 和 gstreamer 体系依赖结构体来实现,其中涉及到虚函数,我们可以发现其中某些结构体成员的名字和其父结构体的成员是同名的,而这是允许的。原创 2023-07-28 16:26:49 · 196 阅读 · 0 评论 -
[c/c++] 如何传递可变参数列表 ... 给其他函数
在封装一些可变参数列表的函数的时候,会发现不能直接使用 ... 作为参数列表继续往下传,需要先获取参数列表,才能继续往下传。原创 2022-11-23 17:26:06 · 1981 阅读 · 0 评论 -
[C/C++] C++中直接使用函数返回值作为入参
【代码】[C/C++] C++中直接使用函数返回值作为入参。原创 2023-07-19 17:09:31 · 167 阅读 · 0 评论 -
[c/c++] 复杂变量类型的阅读方法
复杂变量的解读-->从右向左,最靠近变量名的那个符号即是变量的真实属性。//从右向左const int * p; //p是指针,指向const intint const* p; //p是const指针,仅指向某个intint *const p; //同上const int const* p; //p是const指针,仅指向某个cosnt intconst int *const p; //同上//(!) const* 和 *const 等价...原创 2020-06-02 11:02:33 · 352 阅读 · 2 评论 -
[boost] std::msm (meta state macine)
参考:Concepts - 1.76.0原创 2021-11-11 17:06:36 · 212 阅读 · 0 评论 -
[c/c++] size_t是什么
size_t 是一个 unsigned X 类型,这里的 X 可以是 char ,int ,long ,long long 等等,因此 size_t 的最大值是根据实际情况而改变的,定义是他能容纳当前系统所能定义的数据的最大尺寸值,比如定义一个包含 4G 个元素的 char 数组。那么 size_t 就是一定可以存的下 4G 这么一个整数。之所以使用size_t,而不是 unsigned int 或者其他,主要是出于两个目的:1)提高代码移植时的兼容性;原创 2022-11-10 10:31:50 · 1059 阅读 · 0 评论 -
[linux c/c++] c++ & c 混合工程的知识点
1#ifdef __cplusplus2 extern "C" {3#endif4 int main(int argc,char **argv)5 {6 代码N行;7 }8#ifdef __cplusplush9 }10#endif当某个工程中既有c++又有c的时候,如果某段代码(...原创 2018-04-23 14:28:20 · 145 阅读 · 0 评论 -
[linux c/c++] 使用mtrace 和 muntrace 进行应用程序的内存问题跟踪
前言:内存直接访问想来都是c/c++语言的精髓,但往往也是疑难杂症的高发区,内存泄漏问题最为常见,同时也非常难以定位,mtrace即muntrace通过向内核中注册钩子函数以获得内核关于内存管理的相关信息,进而进行一定的逻辑分析,给出相应的建议。函数接口: void mtrace(void) 通过对内存管理系列函数(malloc,realloc,memalign,free)注册钩子来达到监控内存泄露和其他内存错误操作 void muntrace(void) ...原创 2020-05-28 11:32:38 · 1327 阅读 · 0 评论 -
[c++] using配合虚函数使用
c++并没有要求基类的每个虚函数都要在派生类中实现,但是有些时候我们把基类的这些虚函数都在派生类中描述一下(方便使用者查看),但是一旦我们把虚函数声明出来,那就意味着我们做了重载动作,此时就逼得我们不得不写出自己的虚函数重载版本,但是很多时候我们还是想使用基类版本,那么此时就有两种方案:方案一:1)在派生类的重载版本中使用域访问运算符调用基类版本 class A{ virtual void func(){ } virtual void func(int){ } } cl原创 2020-06-27 18:27:31 · 245 阅读 · 0 评论 -
[linux c/c++] linux下定时器的使用
前言:linux下,定时器有两种实现:1)使用alarm函数进行计时,alarm函数计时满后会发送ALARM信号,注册信号处理函数即可;2)使用linux内核的原生timer,需要引入内核模块,头文件为linux/timer.halarm://功能描述:在5s内轮询产生的随机数(1s生产一个随机数),判断随机数是不是100的整数倍,如果是,则输出定时器剩余时间,如果不是,继续#include <stdio.h>#include <signal.h&...原创 2020-05-29 08:44:39 · 8982 阅读 · 0 评论 -
[c++] 可变入参在c++中的使用
前言:c/c++的默认调用协定是 “从右向左遍历参数列表的方式压栈” ,并且回收栈空间的动作由函数调用者完成,对应的前缀是 _cdecl,那么我们便可以利用这一特性,在函数的参数列表中使用 ... 来表示此处有 n 个入参,具体数量由调用者决定。这便是传统的动态参数列表实现方式。c++ 11提供了更加便捷的initializer_list<T> 来完成上述任务。传统的动态参数列表:#include <stdio.h>#include "stdarg.h"...原创 2020-06-02 15:48:38 · 342 阅读 · 0 评论 -
[c++] 初始化时,尽量使用拷贝构造,尽量不用赋值构造
前言:初始化是指变量在创建的同时就给予一个初始值。拷贝构造初始化 与 赋值构造初始化拷贝构造初始化 赋值构造初始化 string s2(s1) string s2 = s1 string s3("123") string s3 = "123" 从语法上来说,上面的第一列和第二列得到的结果是一样的,但是他们的执行流程确有区别。二者区别:赋值初始化:1)表达式中出现赋值符号;2)初始化的过程包括 “创建临时对象” 和 “调用拷贝构造函数” 两步。.原创 2020-06-02 11:16:19 · 257 阅读 · 0 评论 -
[c++] 同一线程两次加锁可能导致死锁问题
前言:线程间同步的机制很多,最常用的就是各种锁,比如 c++ 11 标准中的 mutex 和 recursive_mutex , 比如 Win32 的 CRITICAL_SECTION 和 Mutex 。 c++开发中我们经常会做一些适用性封装,这也会引入一些潜在的风险,如果不注意的话便可能导致死锁。最常见的就是单线程重复加锁会导致死锁问题。代码:// ConsoleApplication12.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#inclu.原创 2021-02-05 15:44:03 · 6836 阅读 · 0 评论 -
[linux c/c++] 应用程序的内存分段
/*g-global l-local* * s-static* * c-const* * n-not init* * i-init* * {type}=int char ...* * v-valued* */#include <stdio.h>#include <stdlib.h>#define yk_macro_0 0 //?#define yk_macro_1 1 //?int yk_g_n_int; ...原创 2020-05-29 08:45:14 · 231 阅读 · 0 评论 -
[c/c++] TODO List
1)有优先级的条件变量,c可以实现,modern c++是否有现成的解决方案?2)有什么方法能组织成员函数之间互相调用?原创 2022-12-27 09:43:42 · 212 阅读 · 0 评论 -
[c++] 多重继承、虚继承、菱形继承
多重继承的特性和使用和单继承没区别。按照单继承来使用即可。多重继承可能会引入一个“菱形继承的问题”,这个问题其实并不算问题,因为它合情合理,即多个基类拥有一个共同的基类,那么在构造的时候,由于构造的递归特性,就会出现共同基类出现两份实例的情况,而且如果针对性修改,那么如果不在访问共同基类的时候先指定直接基类名称空间,则会出现访问的二义性。同时,菱形继承还会引入一个共同基类实例的内存开销。不过,有些场景下,可能还确实需要两份共同基类。这样看,菱形继承 只是一个 “合理”的现象,而不是问题,只原创 2020-06-28 08:58:57 · 159 阅读 · 0 评论 -
[C/C++] 如何在main函数之前执行一些代码
方法1 : 借助类的构造函数class A{public: A(){ //do something }}//main.cppA a;int main(){ ...}全局变量的初始化早于main函数,故可行。方法2:借助lambda表达式CRITICAL_SECTION cs;int a = [](CRITICAL_SECTION& _cs){ //注意这里是引用,不然会对CRITICAL_SECTION进行.原创 2020-08-12 18:45:22 · 818 阅读 · 0 评论 -
[linux c/c++] Fork & Clone & Pthread_create
前言:内核的最底层只有clone,fork和pthread_create分别是针对clone面向进程和面向线程的封装正文:todo原创 2020-05-26 10:42:32 · 297 阅读 · 0 评论 -
[linux] coredump相关知识点
开/关coredump文件生成:ulimit -a 罗列系统的所有限制ulimit -c 罗列当前core文件的尺寸限制ulimit -c unlimit 不限制core文件的大小(开启)ulimit -c 0 限制core文件大小为0(关闭)设置coredump文件参数:查询core dump文件路径:方法1:# cat /proc/sys/kernel/core_pattern方法2:# /sbin/sysctl kernel.core_pattern修改co...原创 2020-05-26 10:17:55 · 216 阅读 · 0 评论 -
[c++] STL中的容器
前言:容器作为STL的重要组成部分,其主要包括两大类:顺序容器 和 关联容器 。虽说这二者都是用来存储数据的数据结构,但是他们的底层实现和特长有很大差别:顺序容器不能通过按值查找,包括附加在其上的迭代器和算法,如果想获得某个节点,必须遍历顺序容器。 顺序容器多由数组 和 链表构成,关联容器多由hash表和树构成。 由于顺序容器的底层是数组和链表,因此默认是无顺的,这里不要望文生义地认为顺序容器内部元素是顺序存储。 树形结构的关联容器,其数据在底层存储默认就是有序的,因此对其元素进行排序和查找要原创 2020-06-27 16:12:16 · 98 阅读 · 0 评论 -
[c++] 单例模式的实例释放问题
要点:1)静态变量在应用程序退出时会被销毁,也在此时其析构函数会被调用;2)静态指针的销毁不会伴随析构函数的调用,因此不能指望static sigleton* _instance的销毁来触发析构函数;3)在类的析构函数中delete自己会造成无限迭代循环,因此不能在自己的析构函数中 delete _instance 企图销毁单例。例子:class CommonUse : public QObject{ class GC { ~GC(){ .原创 2020-06-05 11:10:21 · 534 阅读 · 0 评论 -
[c/c++] 在c++代码中调用python
Embedding Python program in a C/C++ code - CodeProject原创 2023-01-05 09:40:14 · 57 阅读 · 0 评论 -
[APUE] dlopen 的 RTLD_NOW 和 RTLD_LAZY 的区别
You want to use when:You want to use when原创 2022-10-27 11:12:30 · 806 阅读 · 0 评论 -
[C/C++] 32位系统和64位系统中各个变量类型占的字节数
32位编译器: char :1个字节 char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即4GB) short int : 2个字节 int: 4个字节 unsigned int : 4个字节 float: 4个字节 double: 8个字节 long: 4个字节 long long: 8个字节 unsigned long: 4个字...原创 2020-07-21 11:02:11 · 4906 阅读 · 2 评论 -
[APUE] 标准I/O(1)
#include <iostream>#include <string.h>#include <stdlib.h>#include <stdio.h>using namespace std;FILE *f = fopen("/home/ubuntu/3.txt","w+"); //open file , read and write, everytime truncate fileint i = setvbuf(f,NUL.原创 2022-01-26 11:58:39 · 378 阅读 · 0 评论 -
[c/c++] 使用函数指针会导致程序变慢
某些cpu和内存极端情况下,一个简单的函数指针调用可能会卡 数秒。原创 2022-11-08 17:25:00 · 680 阅读 · 0 评论