- 博客(87)
- 收藏
- 关注
原创 现代 C++ 使用建议
我为什么要使用异常?如何使用异常?Standard C++——来自 ISO Google 风格指南Google C++ Style Guide
2024-10-28 14:42:24
213
原创 内存序学习笔记(一)——表达式求值顺序
你知道为什么 `i = i++ + 2` 在 C++17 前行为未定义吗?你知道为什么 `func(a(), b())` 中,`a()` 与 `b()` 的执行顺序为什么不是确定的吗?这篇文章可以解答你的疑惑。
2024-09-05 09:40:55
1150
原创 说明基于何种原因(操作系统,硬件角度出发),我们称线程是资源调度的独立单位,进程是资源分配的独立单位
cpu 工作时,依据算法不同,总是将时间片分配给不同的线程(而不是进程或者其它的什么东西),让它们完成工作。它们调度资源,例如打开文件、申请内存,这代表线程是资源调度的独立单位。综上所述,从操作系统和硬件角度来看,线程被称为资源调度的独立单位,而进程被称为资源分配的独立单位,主要是由于它们在系统中各自的作用和功能的不同。进程之间的资源互相独立,拥有独立的内存空间和系统资源,例如堆栈、文件描述符,这代表进程是资源分配的独立单位。
2024-09-03 10:39:42
467
原创 C 语言 static 关键字
变量生命周期与程序生命周期相同。限制变量作用域在定义它的文件中。当你希望变量或函数只在当前文件中使用时,可以使用。限制函数作用域在定义它的文件中。
2024-09-02 16:41:30
241
原创 进程间通信(IPC)方式
管道是一种简单的IPC机制,允许一个进程将数据写入管道,另一个进程从管道中读取数据。管道是单向的(半双工),数据只能沿一个方向流动。共享内存是一种高效的IPC方式,通过将一块内存区域映射到多个进程的地址空间,使这些进程可以直接访问这块内存。消息队列是另一种IPC方式,允许进程以消息的形式发送和接收数据。消息队列是面向消息的,进程可以将消息发送到队列中,另一个进程可以从队列中读取消息。管道适合简单的父子进程通信,尤其在数据量不大且通信方向单一的场景下。共享内存。
2024-09-02 15:28:57
452
原创 C++ 编译三环节
调用汇编工具将汇编代码转化为可以被计算机直接执行的二进制文件。汇编器将每个源文件编译成一个目标文件,将目标文件组合成一个可执行文件。链接器会根据编译器生成的目标文件生成最终的编译输出。将对未定义符号的引用替换为正确的地址来链接所有目标文件。将预处理后的文件作为输入,进行词法解析、语法解析、语义解析。将 C++ 源代码转化成汇编代码。移除注释,展开宏,展开头文件。在此阶段,最常见的错误是缺少定义或重复定义。生成没有预处理指令的 C++ 文件。目标文件可以引用未定义的符号。
2024-09-02 10:30:41
324
原创 设计模式——结构型模式
假设在一个军队中,一个师包含多个旅,一个旅包含多个团。要统计人数,师长等自己的每个旅汇报人数加起来,旅长等自己的每个团汇报人数加起来,每个团报数得到自己团的人数。通俗的讲,给原始接口加个包装,在调用原始接口前/后做一些额外的工作。例如服务端提供的服务需要一个 json 文件,而客户端(服务的调用者)只能提供 xml 文件。当客户端提供的参数与服务端提供的服务的参数不兼容时,适配器可以作为中间件让他们兼容。提供与服务相同的接口,将业务委托给真正的服务,可以在真正的服务前后做一些额外的工作。
2024-08-28 11:05:17
574
原创 c++ 面向对象三大特性
通过封装,我们可以控制类成员的访问级别(例如:public、protected 和 private),限制对类内部数据的直接访问,确保数据的完整性和安全性。继承是一个类(派生类,Derived Class)从另一个类(基类,Base Class)那里获得其属性和方法的过程。**总结:封装、继承和多态是面向对象编程的三大核心特性,能够帮助我们编写更加模块化、可重用和可维护的代码。封装是将数据(属性)和操作这些数据的函数(方法)组合在一个类(Class)中的过程。**面试高频指数:★★★★☆**
2024-08-02 09:03:30
400
原创 CLOSE-ON-EXEC 的重要性
当我们杀死 B 进程后,A 与 B 的连接并未断开(现象为 A 与 B 连接的 fd 仍显示为 ESTABLISHED 状态)。要解决这个问题,我们首先想到 B 进程被杀死时应该关闭与 A 的连接,但结果并不符合按预期。究其原因,B 启动 C 后,C 接管 B 的上下文(通俗来说),包括 B 与 A 的连接。所以我们后来发现,A 与 B 的连接变成了 A 与 C 的连接。项目组成是3个模块(进程):A,B,C。A 与 B 保持 tcp 连接,有需要时,A 向 B 发送控制指令,B 会 启动 C进程。
2024-04-03 11:07:22
243
原创 std::ifstream::tellg()未能正确获得文件大小的问题
2 是 std::ios::eofbit 的值。使用以下函数获取文件大小时,可能得到返回值为 2。
2023-10-10 09:49:55
469
原创 原来移动赋值是 原 子 操 作!
高并发测试do(),并伴随偶尔的update()。然后想到了移动赋值可能是原子操作,问gpt,得到了肯定结果。今天项目里写了一个类,大体如下。但测试结果出乎意料,竟然没逝。
2023-06-14 10:14:31
154
原创 别再用ftime!!有大坑!!
某个业务执行时需要写日志,但调用完日志后(日志中有调用ftime),调用处附近的变量值莫名地被修改了。换成C++的std::chrono就没这b问题了。gdb显示问题出在ftime()上。用gdb的watch定位到日志上。其次,它会污染内存。
2023-05-16 16:10:12
821
原创 C++ Effictive 第6章 继承与面向对象设计 笔记
因此用基类指针声明一个继承类对象,并且基类声明了一个带默认参数的纯虚函数,并且继承类重声明了此函数无默认参数版本时,调用函数会调用继承类函数,并用基类给定的的默认参数。此举下,如果子类函数与父类函数参数也一致,父类函数仍然被遮掩。private也意味着in-implemented-terms-of,与复合相比,尽量使用复合,必要时采用private继承。virtual func() 父类可以提供实现,为了让子类继承接口和实现。子类声明与父类函数同名的函数时,父类函数会被遮掩。strategy设计模式。
2023-02-21 19:13:18
305
原创 shared_ptr的一个使用不慎
pop出智能指针之后,在下一次pop时阻塞,导致上次pop的智能指针引用计数未即时归零。本来等指针指针析构时调用对象的析构函数,发现偶尔会不调用,找了一下午才发现这问题。后面加了两个if后问题解决。
2022-12-13 17:57:28
111
原创 linux 无缓冲立即读取输入的字符
原理就是从/dev/tty文件读取。/dev/tty存放你终端的信息。C++写法C写法,有坑,每读取一个字符都会打开一次该文件,超过一定数量会不被linux允许。此代码来自网络。可以将tty声明为静态,或者每次打开后都关闭该文件
2022-12-06 16:28:43
425
原创 修改一个SQL控制台的心得
现在已经基本做完了,所以没法改动了。如果一开始能想到这点,会方便很多。 为输入的每个字符生成坐标,目前最难做的上下左右功能也会变得简单。 某函数ioctl()可以获取屏幕能容纳的行数和列数。 用两个头对头(入口对入口,也即出口对出口)的栈实现(并不唯一)3.使用无阻塞输入 做这个东西要么输入时不用缓冲区,要么用键盘监控。 但是不知道在用终端ssh连接centos时能不能监听键盘事件。
2022-12-05 18:34:38
318
原创 libevent-bufferevent遇到的坑
1. 多线程操作段错误2. 对evbuffer加锁后还是段错3. 在2情况下创建的buffeevent为nullptr4. 建议加入水位线控制
2022-11-30 11:25:40
350
原创 测试std::unordered_map的hash冲突
std::unordered_map的实现为hash表,所以hash值范围越小,越容易出现冲突,效率越低。m 查找 0.004000 0.018000 0.146000。m2 查找 0.004000 0.004000 0.004000。m用的是自定义的hash函数hash值只有0和1,m2用默认hash函数。n为数据量,times为测试次数,下面结果取最后一次测试结果。n为100,1000,10000时。
2022-10-09 17:14:04
493
原创 函数中有多处返回,多次写释放申请的内存太麻烦?
代码中可能会遇到这种情况,函数中申请了内存,函数中进行多次判断,根据不同情况返回不同的值,每个return前都需要释放申请的内存。解决方式:用unique_ptr代管申请的内存,析构时自动释放。
2022-08-23 11:49:32
150
原创 当编译链接时error:undefined reference to xxx
C++在编译期间不能决定模板参数的类型,如果在编译时有实例调用了类模板函数,则未定义。与这个情况相似:不完整类型不能用于定义该类型的实例,只能用于定义该类型的指针实例。在我的代码中,问题出在模板类函数的声明和定义分别放在.h和.cpp中。是的,没错,这是问题所在。链接时决定模板参数类型。...
2022-08-18 17:07:14
444
原创 error:type/value mismatch at ... ::iterator
修改方式:在 std::list前加类型声明typename。加上typename,让编译器知道你是在声明一个类型而不是访问静态成员。原因:有没有觉得class::xxx的写法像是在访问类里的静态成员。iterator是stl类的嵌套类。错误在编译以下代码时出现。...
2022-08-18 15:03:07
236
原创 C++ std::map用迭代器遍历删除遇到的坑
需求是这样的 表面上看没什么问题,迭代器也在删除后做了赋值,感觉自己避开了坑,很开心。然而当map只有一个元素的时候,在erase(it)后,it的值是map.begin(),此时map.begin()==map.end()。for结束一次循环,++it,那么it = map.begin() + 1,不再等于map.end(),循环继续,并且不会再停下来。在这个项目中,锁也没有释放,就会让后面的线程全部堵在自旋锁上,cpu占用 += 100%。题外话可能会有人吐槽这种遍历复杂度太高N^3。准备增
2022-07-08 10:41:27
2756
原创 psql double类型精确度问题
数据类型real和double precision是不精确的、变精度的数字类型。 在所有当前支持的平台上,这些类型是IEEE标准 754 二进制浮点算术(分别对应单精度和双精度)的实现, 一直到下层处理器、操作系统和支持它的编译器。 不准确意味着一些值不能准确地转换成内部格式并且是以近似的形式存储的,因此存储和检索一个值可能出现一些缺失。 处理这些错误以及这些错误是如何在计算中传播的主题属于数学和计算机科学的一个完整的分支, 我们不会在这里进一步讨论它,这里的讨论仅限于如下...
2022-04-26 11:16:20
1181
原创 docker学习意外收获
docker cp [src] [dest]在容器和主机之间拷贝docker search key-word在docker hub查找dockerdocker rmi image删除镜像docker rm CONTAINER删除实例docker build -t tag将build 的镜像加上tag,就像v1, v2, latest...docker info总览docker信息docker export -o tarfile -...
2022-03-17 16:43:59
1035
原创 linux安装cmake报错can‘t find OpenSSL
用yumyum install libssl-devyum install openssl或者apt-get安装apt-get install libssl-devapt-get install openssllibssl-dev是必须装的,openssl没测试
2022-03-16 16:50:40
676
原创 将vector<string>写入文件,但文件大小与期望不一致
打算用 vector 装 1024 * 1024 * 64 个长度为 16 的 string,共计1GB大小,随机生成内容,写成文件,作为压缩测试的文件。但是用以下语句,写出来的文件大小每次都不一样。ofstream.write((char *)vector.data(), 16 * vector.size());想了很久才悟到,vector 上的对象是在内存上是连续的,但指的是 string 对象。string 的内容未必在(应该完全不在)vector 上。vector 上的连续空
2022-03-03 10:33:07
329
原创 开源项目找不到第三方头文件
问题来自于找snappy压缩算法库时,找到了Google的开源项目然后clone,cmake,make。cmake的时候,出现了error第1、4个error都是找不到目录下的CMakeLists.txt。直接到对应目录下touch一个空的CMakeLists.txt就能解决,因为我不需要用googletest和benchmark。第2、3个error是找不到目标:gtest和gmock。这种比较权威的项目一般会有cmake的选项,可以在cmake时取消某些部分。个人感觉这种
2022-02-28 14:40:04
391
原创 centos7换阿里源
1.备份本地yum源[root@bogon ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak2.获取阿里yum源配置文件[root@bogon ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo3.更新yum缓存[root@bogon ~]# y
2022-02-28 10:16:01
3253
原创 rm指令参数介绍
rm[OPTION]...FILE...DescriptionThis manual page documents the GNU version ofrm.rmremoves each specified file. By default, it does not remove directories.这页手册记录了rm的GNU版本。rm移除每个给定的文件。默认情况下,不会移除目录。If the-Ior--interactive=onceoption is given, ...
2022-02-25 14:48:21
3740
原创 nvcomp压缩算法原理
cascade高效压缩整形数据。由RLE、Delta encoding、Bit-packing组合。RLE:1,1,1,1,3,3 =》值(1,3) 数(4,2);Delta:1,3,2,4,3 =》 1,2,-1,2,-1 相对前一个数的偏移量;Bit-packing:5,6,9,5 =》 5(0,1,4,0) 相对基数的偏移量;LZ4面向byte数据。简单高速。适用于任意数据。LZ4通过匹配重复字符串进行压缩,不是全文...
2022-02-24 16:38:12
1319
原创 C++ primer阅读笔记 继承
若基类中声明了纯虚函数,继承类必须重写该函数。virtual void fun1() = 0;含有纯虚函数的基类是抽象基类,它定义了类的接口,但将接口的实现交给继承类。派生类的成员和友元只能通过派生类访问基类的受保护对象。class Base{protected: int a;};class Inherite: public Base{ friend void f1(Base &b){ //编译器将报错 b.a = 0; }
2022-02-21 16:51:28
227
原创 分布式日志聚集系统开发总结
项目功能主要功能:接收来自多个节点的日志,按节点名存入文件。分析功能:设定多个Tag,将日志与Tag匹配。最终可以让用户指定Tag,将所有匹配日志存入指定文件。对外接口类LogService主要对外接口。启动后持续运行,接收节点日志,交给Handler类处理。用户可以设定并行线程数。TagManager管理Tag。单例。Analyst分析数据。生成Tag文件。内部实现类FileWriter打开文件写入。Han...
2022-02-21 09:51:46
497
原创 C++开发经验之谈1
返回类成员引用时注意是否有修改,导致原引用可能出错某些成员是否可以作为处理它的类的成员,而不是以传参的形式将成员传给处理它的类不能为了效率滥用引用树查找虽然快,但多次查找不如用迭代器进行一次查找,后面就用迭代器某些时候,取指针所指值拷贝不如直接拷贝指针用{}很轻易地限制unique_ptr的作用域。stl.reserve()预留空间但不构建对象,stl.resize()分配空间且构建对象。while(flag)可能被编译器优化共享队列front(); pop.
2022-02-18 16:54:44
182
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人