- 博客(78)
- 收藏
- 关注
原创 用mn查看单例模式符号表——动态加载的动态链接库中的单例
在静态符号表中存在,但在动态表中不存在,这也就是说,动态连接器(dynamic linker)在加载operation.so的时候,无法找到属于动态库的。在程序执行前可以先分析一下count(d1), count(d2), count(m1), count(m2)会分别是多少呢?实例,只能再构造一个新的实例。动态库的实例在动态库中是唯一的,但是不能保证在main和operation.so中唯一。所以,解决问题的关键在于如何让动态库暴露符号表,让动态链接器链接的时候可以检测到。operation中的。
2024-06-29 20:02:51
477
原创 程序设计中的几种逻辑关系
fill:#333;stroke:1;fill:none;important;important;important;important;important;important;important;important;important;important;important;important;important;important;important;important;A1B1A2B2A3B3A4B4A5B5A6B6A7B7A8B8。
2024-06-25 07:38:01
291
原创 为什么 C++ 允许不安全的代码(Bjarne Stroustrup)
几乎所有的 C++ 代码都可以遵循这些简单的规则。如果您使用 C++ 写 C 代码或 C 风格的代码,请不要因为你没法遵循这些规则就认为 C++ 不安全。也就是说,为什么 C++ 支持可以用来违反静态(编译时)类型安全规则的操作?
2024-06-23 14:29:35
322
原创 智能指针shared_ptr的简化实现
shared_ptr采用对象管理资源,通过引用计数自动控制资源的释放时机。实现时需要注意:一个shared_ptr对象具有两个裸指针,这点通过sizeof可简单确定。其中,一个裸指针用于管理使用时分配的资源(实例中 _ptr);另一个用于记录对象信息(示例中_ref)用于记录对象信息的结构体至少包含两个引用计数,即(正常的)引用计数(示例中shared_count)和弱引用计数(示例中weak_count),二者均为原子类型。_ptr所分配的资源是否释放只与shared_count的值有关#in
2022-02-17 11:34:09
602
原创 多缓存无锁极简实现
双缓冲区方案双缓冲方案分配两段缓冲区:读(当前)缓冲和写(下一)缓冲。当执行查询操作时,总是读取当前缓冲区;当执行写操作时,总是在下一缓冲区上操作。当写操作执行完成后,交换操作会立刻将当前缓冲区和下一缓冲区交换,这样,最近更新的缓冲区便可供查询使用,旧的查询缓冲区用于写操作。示例代码:template <typename T> class DoubleBuffer {public: DoubleBuffer():flag(false){} T* write() {
2021-11-16 09:38:42
1070
原创 Linux命令
查询包含指定字符串的行及行号sed -n '/root/{=;p}' /etc/passwd输出:1root:x:0:0:root:/root:/bin/bash10operator:x:11:0:operator:/root:/sbin/nologin查询指定字段包含指定字符串的行# :分隔的第一个字段,以root开头的行awk -F: '$1 ~ /^root/{print $0}' /etc/passwd输出root:x:0:0:root:/root:/bin/bash
2021-06-22 16:44:37
120
原创 注意:需要留意的函数
snprintfint snprintf ( char * s, size_t n, const char * format, ... );该函数的返回值仅可用于判断函数是否执行成功,其大小不能代表s的大小可以分情况讨论s < format的长度时n <= s的长度时:format能够截断至n-1的长度进行拷贝到s并添加结束符\0; 返回值却为format的长度。strlen(s)为n-1;sizeof(s)为s的本身字节数(sizeof所有情况都一样)n > s的长度时:
2021-05-20 17:08:32
87
原创 c++中的多线程锁
std::mutex my_mutex;my_mutex.lock();my_mutex.unlock();std::mutex my_mutex;std::lock_guard<std::mutex> mtx_guard(my_mutex);std::mutex my_mutex;my_mutex.lock();// std::adopt_lock不会重复加锁my_mutex,my_mutex依旧会在mtx_guard析构时解锁std::lock_guard<std:
2021-05-05 11:08:12
315
原创 线程安全的单例新写法
pthread_once多线程安全pthread_once(pthread_once_t *once, void (*init_routine) (void))在多线程编程环境下,尽管pthread_once()调用会出现在多个线程中,init_routine()函数仅执行一次,究竟在哪个线程中执行是不定的,是由内核调度来决定。Linux Threads使用互斥锁和条件变量保证由pthread_once()指定的函数执行且仅执行一次,而once_control表示是否执行过。#采用pthread_
2021-04-21 11:20:14
155
1
原创 面向对象设计原则
1、依赖倒置原则(DIP)高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定)抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)2、开放封闭原则(OCP)对扩展开发,对更改封闭类模块应该是可扩展的,但是不可修改3、单一职责原则(SRP)一个类应该仅有一个引起他变化的原因变化的方向隐含着类的责任4、Liskov替换原则(LSP...
2019-09-24 11:12:49
124
原创 C++内存分段的叫法
最细分:代码段(.text)、只读数据段(.rodata)、读写数据段(.rwdata)、未初始化数据段(.bss)、栈区、共享内存区、堆区其它一些叫法:静态区(代码段、只读数据段、读写数据段、未初始化数据段)和动态区(栈区、堆区)只读代码段(代码段、只读数据段)data段(只读数据段和读写数据段)全局/静态区(data段和bss段)...
2019-09-07 15:19:34
601
原创 Valgrind
Valgrind能检测的错误使用未初始化的内存内存读写越界内存覆盖动态内存管理错误申请和释放不一致申请和释放不匹配释放后仍然读写内存泄漏Valgrind限制:memcheck无法检测global和stack上的内存溢出,因为溢出的地方也在Valid-address (A) bits中。如静态数组。这是由memcheck 的工作原理决定的。慢,20到30倍,被...
2019-08-27 19:39:47
564
转载 SQL常用查询语句
执行顺序MySQL中执行顺序:from—where–group by—having—select—order by粗浅的理解的话,SELECT的语法顺序就是其执行顺序SELECTFROMWHERE (先过滤单表/视图/结果集,再JOIN)GROUP BYHAVING (WHERE过滤的是行,HAVING过滤的是组,所以在GROUP之后)ORDER BY使用count(col...
2019-08-08 09:07:52
140
原创 构造函数,析构函数,运行时多态
#include <iostream>using namespace std;class A {public: A() { f(); // 构造函数中无运行时多态,输出A::f() } virtual void f() { cout << "A::f()" << endl; } ...
2019-08-07 08:09:27
192
原创 智能指针、inline
智能指针智能指针兼有普通对象共享实值对象和auto_ptr自动释放实值对象的双重功能,并自动管理实值对象的生命周期和有效引用的计数,不会造成丢失引用、内存泄漏及多次释放等问题。inlineC++函数内联的工作过程:对任何内联函数,编译器在符号表里 (保存字面常量和符号常量) 放入函数的声明,包括名字、参数类型、返回值类型如果没有发现内联函数存在错误,那么函数的代码也被放入符号表里在调...
2019-08-05 19:50:26
134
原创 c中几个函数的实现 strcpy、memcpy、memmove、memset
函数原型:char* strcpy(char *dst, const char *src);char* memcpy(void *dst, const void *src, const size_t len);char* memmove(void *dst, const void *src, const size_t len);char* memset(void *dst, const i...
2019-08-05 10:42:30
146
原创 C++中的特殊成员函数——拷贝、移动、赋值、销毁
class Foo { Foo(); // 默认构造函数 Foo(const Foo); // 拷贝构造函数 Foo& operator=(const Foo&); // 赋值运算符};拷贝构造函数如果没有自己定义,编译器会自行定义拷贝初始化string dots(10, ','); // 直接初始化string s(dots); ...
2019-08-04 09:29:55
402
原创 STL
容器:序列式容器:array: C++ 内建vector: 动态连续空间,迭代器为普通指针heap: 用array存储priority-queue: 利用max-heap完成list: 双向环形链表存储,只要一个指针,便可表示整个环状双向链表。slist: 单项链表(single linked list)。和list的主要差别在于slist的迭代器属于单向的Forwar...
2019-08-03 09:50:29
119
原创 POINTER ON C
根据下面给出的声明和数据,对每个表达式进行求值并写出它的值。在对每个表达式进行求值时使用原先给出的值(每个表达式的结果不影响后面的表达式)。假定ints数组在内存中的起始位置是100,整型值和指针长度都是4字节。int ints[20] = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170...
2019-07-30 21:03:14
408
原创 new,delete 操作符
new operator = operator new + 构造函数delete operator = 析构函数 + operator deletenew operator是由语言内建的,如sizeof一样,不能被改变意义,总是做相同的事。它的动作分为两方面:分配足够的内存,用来放置某类型的对象。调用一个constructor,为分配的内存中的对象设定初值。这两件事是无法改变的st...
2019-07-29 16:23:12
156
原创 列表初始化(initialization list)与赋值(assignment)
哪些情况只能用 initialization list,而不能用 assignmentconst 和 reference类型成员变量,由于只能被初始化而不能做赋值操作,因此只能用初始化列表类的构造函数需要调用基类的构造函数时class Base {private: int a;public: Base(){} Base(int i): a(i){} void print...
2019-07-27 08:47:16
1152
原创 C++多态
运行期多态编译期多态虚函数表的位置:类中的函数和普通函数一样存储在代码段(.text)。虚函数应该存储在代码段。虚函数表是构造函数执行时创建的,应该放在只读数据段(.rodata)。...
2019-07-19 08:58:32
156
原创 empty class对象空间开销--空白基类优化
#include <iostream>class Empty{};class Nonempty{ int i;};class Ce{ int x; Empty e;};class De1: public Empty{ int x;};class De2: private Empty{ int x;};class Cne...
2019-07-16 15:04:08
165
原创 单例模式
C++实现class Singleton() { protected: Singleton(){} private: static Singleton *p; public: static Singleton* instance();}Singleton* Singleton::p = NULL;Singleto...
2019-07-15 09:15:07
127
原创 线程同步
互斥量、自旋锁、读写锁、条件变量、线程信号、全局变量死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去原因(1) 因为系统资源不足。(2) 进程推进顺序不当。(3) 资源分配不当等。如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同...
2019-07-12 16:39:36
157
原创 进程间通信
8种进程间通信:共享内存、消息队列、信号量、信号、命名管道、无名管道、文件、socket共享内存用于在程序之间高效地共享数据POSIXshm_openshm_unlinkftruncatefstatmmapmunmapSystem V# 创建int shmget(key_t key, size_t size, int shmflg)# 连接共享内存段到进程地址空间v...
2019-07-12 15:46:12
192
原创 七层协议
应用层: 为特定应用程序提供数据传输服务(SMTP, TELNET, HTTP, FTP, DNS, TFTP, RIP, BOOTP, DHCP, SNMP, NFS)传输层: 为进程提供通用数据传输服务。TCP,面向连接、可靠的数据传输服务,以报文段为单位;UDP,无连接、尽最大努力交付的数据传输服务,以用户数据报为单位。TCP提供完整性服务,UDP提供及时性服务。网络层: 为主机提供数...
2019-07-11 23:24:36
193
原创 Redis数据结构与对象
Redis使用五种类型对象实现实现键值对数据库:字符串、列表、哈希、集合、有序集合字符串编码 int, raw或embstr列表编码 ziplist或linkedlist哈希编码 ziplist或hashtable集合编码 intset或hashtable有序集合编码 ziplist或skiplist...
2019-07-11 23:06:48
124
原创 神奇公式
神奇公式很简单,就两个选股模型:净有形资产回报率=EBIT/(净流动资产+净固定资产)实际上就是ROIC可以直接在同花顺上面提问这个指标。就会按照大小排序出来一个A股上市企业名单,把这份名单导出来为excel格式。把ROIC从大到小排序,依次标记为1.2.3.4…EBIT/EV也可以直接在同花顺里面把这个公式输入进去,也会出现一份企业名单,把这份名单也导出来。把EBIT/EV数据从大到小...
2019-07-11 14:19:28
2238
转载 C++内存管理与Python垃圾回收机制
C++的内存管理方式STL的allocator,最新版本默认使用的分配器C++的内存管理方式:在c++中内存主要分为5个存储区:栈(Stack):局部变量,函数参数等存储在该区,由编译器自动分配和释放.栈属于计算机系统的数据结构,进栈出栈有相应的计算机指令支持,而且分配专门的寄存器存储栈的地址,效率分高,内存空间是连续的,但栈的内存空间有限。堆(Heap):需要程序员手动分配和释...
2019-05-30 16:11:10
594
原创 共识算法
共识算法两个原理:FLP与CAPFLP定理CAP定理PaxosRaftPBFT工作量证明——PoW(Proof of Work)股权权益证明——PoS(Proof of Stack)委托权益人证明机制DPoS(Delegated Proof of Stack)两个原理:FLP与CAPFLP定理FLP定理由Fischer、Lynch和Patterson三位作者在1985年发表。定义:在网络可...
2019-05-25 09:43:43
269
原创 SSL
SSL通信过程1、当客户机c连接服务器s时,它发送一个28字节的随机值 nc到服务器,2、而s的回应是自己的随机值 ns,加上证书 certs。3、客户机确认VkCA( < attrs, Eke, interval >,a ) = true, 并且确认当前时间处于有效时间区间interval。如果两个条件都满足,则就证明了服务器的身份。接着客户机生成一个随机的46字节的预主密钥(...
2019-05-22 10:43:44
194
转载 同步和异步
同步I/O和异步I/O操作对比POSIX把这两个术语定义如下:同步I/O操作(synchronous I/O operation) 导致请求进程阻塞,直到I/O操作完成所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户...
2019-04-23 14:50:11
136
原创 进程线程的区别
每个进程中的内容:地址空间,全局变量,打开文件,子进程,即将发生的报警,信号与信号处理程序,账户信息每个线程中的内容:程序计数器,寄存器,堆栈,状态1、 进程用于把资源集中到一起,而线程则是在CPU上被调度执行的实体2、 线程实体可以共享同一个地址空间和所有可用数据。多进程(具有不同地址空间)却不能3、 多线程是CPU密集型的,那么并不能获得性能上的增强,但如果存在大量计算和IO处理,...
2019-04-23 14:32:19
134
原创 Python垃圾回收机制
Garbage Collection(GC)Python 主要采用引用计数的GC机制,为解决循环引用问题,引入标记-清除和分代回收引用计数优缺点优点简单实时性:一旦没了引用内存就直接释放了。处理回收的时间分摊到了平时。缺点维护引用计数消耗资源循环引用...
2019-04-23 14:20:44
109
原创 强制类型转换
四种强制类型转换:static_cast, const_cast, dynamic_cast, reinterpret_cast.1. static_cast< type > (content)类似于c中的强制类型转换(type)content2. const_cast< type_id > expression去掉指针或引用的const属性const_cast的...
2019-04-09 11:09:39
101
原创 动态内存与智能指针
智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。新标准库提供的两种智能指针的区别在于管理底层指针的方式:shared_ptr允许多个指针指向同一个对象;unique_ptr则独占所指向的对象。标准库定义的weak_ptr伴随类,是一种弱引用,它指向shared_ptr所管理的对象。1.shared_ptrshared_ptr 和 unique_ptr都支持的操作:sha...
2019-04-09 10:25:09
136
原创 TIME_WAIT状态
TCP连接终止中的TIME_WAIT状态可靠地实现TCP全双工连接的终止;允许老的重复分节在网络中消失可靠地实现TCP全双工连接的终止;可以通过假设最终的ACK丢失了来解释。服务器将重新发送它的最终那个FIN,因此客户必须维持状态信息,以允许它重新发送最终那个ACK。如果客户不维护那个状态信息,它将响应以一个RST,该分节将被服务器解释成一个错误。如果TCP打算执行所有必要的工作以彻底终止某个...
2019-04-05 16:16:41
130
原创 守护进程
守护进程守护进程编程规则守护进程守护进程(daemon)是生存期长的一种进程。常常在系统引导装入时启动,仅在系统关闭时终止。没有控制终端。1. 父进程ID为0的为内核进程,名字出现在方括号中的为内核守护进程。2. 图示版本的Linux使用名为kthreadd的特殊内核进程来创建其他内核进程。3. 对于需要在进程上下文执行工作但却不被用户层进程上下文调用的每一个内核组件,通常有它自己的内核守...
2019-02-12 15:14:55
180
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人