C++
文章平均质量分 54
ALITAAAA
这个作者很懒,什么都没留下…
展开
-
静态链接和动态链接
静态链接要解决的事情现代的大型软件动辄几百万行的代码,如果我们把所有的代码放在同一个main.c文件中,我想在后期寻找bug和维护的时候,一定是一个头疼的事情。最常用的结局方法便是使用不同的模块来完成一个功能,然后把这些模块拼接起来,组成一个完整的应用程序。所以,静态链接就是用来解决不同模块之间的通信问题:1.不同模块之间的函数调用;2.不同模块之间的函数调用;一个复杂的软件就是把全部分成一个小系统来进行处理,把每个模块的源代码进行独立的编译,然后通过静态链接组装起来,链接就是整个组装模块的过程,链原创 2021-07-30 20:53:04 · 433 阅读 · 0 评论 -
C++智能指针简单剖析
智能指针的意义在C++中,new和delete申请和销毁堆内存的关键字,而程序员在进行堆内存申请之后,常常容易忘记delete释放堆内存,而这也就容易造成一种现象–内存泄漏,也就是一块堆内存被申请之后,没有被释放,导致其他程序也不能使用这块堆内存,从而造成堆内存的浪费,降低了c++的开发效率。在java等语言中,只有new的关键字,而没有delete关键字,这就是因为java语言内存回收机制,而由于之前C++对于代码运行效率的极度追求,所以也没有引入这种机制。但是。随着C11标准等的发布,智能指针逐渐被大原创 2021-07-30 20:37:44 · 207 阅读 · 0 评论 -
LeetCode 1114 按序打印
需求在多线程环境下按序打印firstsecondthird,并且保证打印顺序不会出错使用信号量#include<semaphore.h>class Foo { sem_t sem1; sem_t sem2;public: Foo(){ //sem_init 初始化信号量 //对信号量进行初始化; sem_init(&sem1,0,0);sem_init(&sem2,0,0); } void原创 2021-06-16 11:46:52 · 155 阅读 · 0 评论 -
C++实现一个简单的Hashtable
哈希函数哈希函数用于将一个大数(手机号码)或字符串映射为一个可以作为哈希表索引的较小整数的函数。也就是,对一个输入stdin可以转换成另外一个索引比较小的stdout。用公式表达就是stdout=H(stdin)。采用哈希函数可以进行加密等操作。当前的比特币挖矿的原理就是每一个比特币都是通过哈希函数加过密的,所以我们只有不断的去尝试加密后的数字,来得到加密前的币。一个好的哈希函数应该满足以下几个条件:1. 执行效率要高(效率高,对于一段很长的字符串或者二进制文本也能快速计算出哈希值。2. 散列结果应原创 2021-05-22 16:41:38 · 457 阅读 · 0 评论 -
C++11--右值引用
右值引用的语法定义传统的C++引用(&)使得标识符关联到左值。传统的作指示一个表达式,程序可以获取变量的地址,然后申请一个空间。而C++11的新标准中新增了右值引用 ,使用&&来表示。左值的英文简称是lvalue,右值的英文简称是rvalue,这并不是left value 和right value的简称,而分别是locator value的缩写,意思是在内存中可明确寻址的的数据。 而rvalue指的是read value,也就是那些可以提供数据值的数据。简单来讲,可以通过两种方原创 2021-04-08 18:49:18 · 174 阅读 · 0 评论 -
C++设计模式之《单例模式》
饿汉模式饿汉模式也就是进入主函数之前就创建对象,此时线程安全。类外实例化–》所以是线程安全;无论是指针还是引用,都是同一个对象,所以线程安全;//饿汉模式 --》主函数一运行就创建实例化对象class Singleton{private: int value; Singleton(int x = 0) :value(x) { } Singleton(const Singleton&) = delete; Singleton& operator=(const Si原创 2021-03-30 21:29:29 · 76 阅读 · 0 评论 -
抽象工厂模式
标题class Log{public: virtual void writeLog() = 0; //纯虚函数,抽象类, virtual ~Log() {}};class database :public Log{public: database() {} ~database() {} void writeLog() { cout << "Write Database Log!" << endl; }};class fileLog :pub原创 2021-03-30 18:45:58 · 83 阅读 · 0 评论 -
C++设计模式之简单工厂模式
工厂模式的定义工厂模式主要有如下两个功能:创建对象的接口,分装在了对象的创建之中。具体化类的工作延迟到了子类中。也就是说,工厂模式可以实现对类对象的生产,而类对象的生产是通过工厂方法来实现的,而不能用户自己创建。而且工厂可以根据用户实际需求,来生产所需要的对象。根据示意图,工厂Factory中实现了方法CreateProduct()来进行产品的生产,而对于不同的产品需求,多态实现不同的产品生产,而保留了产品的生产权利只在工厂之中,使得产品的安全性更高。简单工厂模式代码实例struct S原创 2021-03-30 17:36:18 · 178 阅读 · 0 评论 -
memcpy的实现
void* memcpy(void* dest,const void* src,int len){ if(dest==NULL || src==NULL) return NULL; char* d; const char* s; if(dest>src+len || dest<src) { d=dest; s=src; //不会发生覆盖 while(len--) { *p++=*s++; } }else{ //可能发生覆盖,从后往前拷贝原创 2021-03-21 11:08:14 · 75 阅读 · 0 评论 -
C++STL系列--1.顺序容器vector,list,deque
容器的定义容器,置物置所也。容器通俗来讲就是一种数据结构。STL提供了一组顺序容器:vector,list,deque,stack,queue,priority_queue;其中stack和queue只是deque改头换面而成,内部的数据结构还是deque。vector容器vector的数据和array非常相似。但是array是静态空间,一旦配置就不能改变;需要扩容的时候需要手动扩容,非常麻烦;而vector是动态空间,随着元素的加入,内部机制会自动扩容空间容纳新元素。vector采用的数据结构原创 2021-03-07 12:43:28 · 186 阅读 · 0 评论 -
c++编译链接阶段的目标文件相关
目标文件的格式目标文件是编译器编译了源代码之后生成的文件格式(.O)。目标文件从结构上来说,是已经编译好之后的可执行文件格式,还未经过链接,其中可能有些地址和符号还未调整。所以说,目标文件和可执行文件的内容和结构很相似,通常在Linux系统下采用ELF格式来存储。 此外,值得注意的是,不光可执行文件按照可执行文件格式存储,动态链接库(DLL)和静态链接库(Static Linking Library)都按照可执行文件格式存储。目标文件的结构目标文件中存储了编译后的机器指令代码、数据、符号表、调试信息原创 2020-12-07 17:07:28 · 376 阅读 · 1 评论 -
关于程序编译的四个阶段的再次解读
程序编译的4个过程(记录贴,学渣学习两月半c++练习生第一次blog,若有错误请提出)在使用编译器编译一段程序时,当我们编辑完成之后,只需要点击编译键,则编译器则会返回对这段程序的编译结果,如果错误则返回错误的地方以及错误提示,方便我们对此处的程序进行修改,而使程序可以完成编译。但是我们是否曾纠结过编译器在编译的时候是一个什么样的过程。我们只知道此段程序,函数在编译的时候一共分为四个阶段: ...原创 2019-11-07 20:58:42 · 828 阅读 · 0 评论 -
c语言之内存对齐
结构体在学习结构体的时候,老师留下了一个很有意思的问题:原创 2019-11-13 10:49:16 · 203 阅读 · 0 评论 -
详解多态的实现机制
多态的三种表现形式多态: 就是多种形态,在完成某个行为时,不同对象完成会产生不同的结果。在函数内部的表现形式便是同一个函数的接口,但是出现的不同的结果。多态一共有三种形式:1.静多态,就是在编译阶段确定函数的调用;2.动多态,在运行阶段才会确定函数的调用。3.宏多态,在预编译阶段就确定了函数的调用。而在默认状态下,一般默认都是动多态。而实现动多态,在需要虚函数来提供支持;多态的实现机制因为静多态只有在运行阶段才会确定函数的调用,所以我们需要在运行阶段获取到函数的入口地址才能实现多态。但是在程原创 2020-11-02 16:30:10 · 1200 阅读 · 0 评论