自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(149)
  • 问答 (1)
  • 收藏
  • 关注

原创 为什么 C++ 要求函数先声明再使用

技术上确实可以在链接阶段做,但 C++ 的设计哲学和语言模型不允许这么做。

2025-07-23 23:23:37 698

原创 C++ 编译链接机制的演化路径

以 完全问题驱动的方式 推导 C++ 编译链接机制的演化路径。每一步都基于前一阶段无法解决的问题,提出新的设计方案,不依赖当前 GCC 或 MSVC 的实现细节,而是像一个架构师一样,从零开始设计一个现代 C++ 系统。

2025-07-20 12:54:37 653

原创 c++重定义探究与思考

任何变量、函数、类、枚举、模板等实体在整个程序中必须有且仅有一个定义​​,且在不同翻译单元(Translation Unit, TU)中使用时,定义必须完全一致。违反 ODR 会导致未定义行为(UB)或链接错误。将会从简单的例子开始一直到上面那个让人困惑的问题,慢慢理解odr例如我们在同一个cpp文件中定义了int x = 1;int x = 2;执行编译的时候就会报错int x = 1;但是我们在不同的函数中定义相同的变量并不会有问题int x = 1;int x = 2;

2025-07-10 00:12:31 847

原创 gcc编译构建流程-动态链接库

代码实现如下编译成一个动态库。

2025-06-03 00:04:47 400

原创 gcc编译构建流程-函数未定义问题

我们有一个项目// add.h// add.cpp我们进行编译链接gcc -c main.cpp -o main.o # 编译main.cppgcc -c add.cpp -o add.o # 编译add.cppgcc main.o add.o -o main # 链接两个目标文件链接的时候就会报错,我们声明并且使用了add_v2函数,但是并没有实现链接器如何检测函数未实现?链接器扫描所有目标文件的重定位表 → 收集未解析符号 → 在符号表中匹配定义 → 若缺失则报错。

2025-06-02 15:19:29 970

原创 gcc符号表生成机制

编译阶段:每个源文件编译成目标文件,生成局部符号表。链接阶段:合并所有目标文件的段。合并符号表,进行符号解析(将未定义的符号绑定到定义的地方)。重定位:根据新的段布局修改符号引用的地址(利用重定位表)。输出可执行文件或共享库。通过这个流程,链接器确保了程序中的所有符号引用都有唯一的定义,并位于正确的地址。

2025-06-02 13:55:54 918

原创 gcc编译构建流程

上面的命令其实会报错,我们生成二进制时会将所有的目标文件.o合并成最终的可执行文件。gcc是编译c语言的,但是我们使用了std::cout这个函数,这个是c++语言的,在链接的时候gcc从c语言中找不到这个函数,所以报错。问题是为啥编译的时候(gcc -c)不会报错呢?gcc -c 的作用是​​生成目标文件(.o)​​,仅执行预处理、编译和汇编,​​不进行链接​​。​​语法检查​​:GCC 检查代码的语法合法性(如括号匹配、分号缺失等)。

2025-05-25 21:35:51 874

原创 leetcode-快慢指针系列

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。仅仅是为了标识链表的实际情况。如果有环的话,那么兔子和乌龟都会进入环中。这时用「相对速度」思考,乌龟不动,兔子相对乌龟每次只走一步,这样就可以看出兔子一定会和乌龟相遇了。核心点就是当快慢指针相遇的时候,快指针的距离是慢指针的两倍。如果链表中存在环 ,则返回 true。给你一个链表的头节点 head ,判断链表中是否有环。

2025-05-23 22:41:07 481

原创 小白服务器开发-socket网络编程

它就像是一个两端分别连接着两个不同主机上进程的通信管道,屏蔽了网络通信底层的复杂细节,让程序员可以通过简单的 API(应用程序编程接口)来实现跨主机的进程间的数据传输,从而有效地解决了跨主机进程间通信的问题,满足了日益增长的网络应用需求,广泛应用于各种网络应用领域,如 web 服务器与浏览器之间的通信、即时通讯软件中的消息传递等场景。一切设置好之后,服务器就可以接客了,通过accept函数等待客户端的连接,如果有连接就返回客户端的地址,同时返回一个socket对象用来跟客户端交互。

2025-04-19 00:24:22 595

原创 条件变量,锁,共享数据的关系

条件变量、共享数据和锁之间的三方耦合关系源于多线程环境下对资源访问的同步需求。以下是关键点分析:条件变量中通常会对共享数据进行判断和处理,如果不加锁就会出现数据竞争的问题,所以并不是条件变量要跟锁一起使用,而是上锁为了保护共享数据,共享数据恰好在条件变量中,因此才会造成,条件变量,共享数据,锁的三方耦合。

2025-03-21 22:02:18 442

原创 c++多线程条件变量

只有在锁的保护下,条件变量才能正确地工作,并保证线程之间的数据可见性。如果消费者线程在检查队列是否为空的时候不使用锁保护,生产者线程可能会在消费者线程检查的中间过程插入数据,导致检查结果不准确。条件变量用于线程之间的通信和同步,当线程等待某个条件时,必须确保该条件的状态是被保护起来的。如果没有锁保护,在线程等待条件时,其他线程可能会修改条件相关的数据,导致数据不一致和竞争条件。通过互斥锁,可以确保这三步操作是原子的,即在多线程环境下,其他线程不能在步骤 2 和 3 之间修改条件相关的数据。

2025-03-16 12:36:57 377

原创 c++多线程锁机制

多线程访问共享数据时需要加锁。

2025-03-02 23:17:18 755

原创 推荐算法实践:UserCF

UserCF(基于用户的协同过滤)的核心思想是。它通过分析用户之间的相似性,为用户推荐其他相似用户喜欢的物品。

2025-02-22 23:13:32 1129

原创 GCC头文件搜索顺序详解

在C/C++编程中,合理管理头文件的引入路径对于项目的组织至关重要。GCC编译器提供了灵活的机制来指定头文件的搜索路径,这主要通过#include "…"和#include <…>两种形式实现。本文将详细介绍这两种形式的区别以及如何使用-I参数优化头文件的搜索过程。

2025-02-20 00:19:29 1164

原创 推荐算法实践:movielens数据集

MovieLens 数据集是由明尼苏达大学的GroupLens研究小组维护的一个广泛使用的电影评分数据集,主要用于推荐系统的研究。该数据集包含用户对电影的评分、标签以及其他相关信息,是电影推荐系统开发与研究的常用数据源。

2025-02-11 22:24:36 2070 1

原创 c++面试:符号修饰

在C++中,名称修饰(Name Mangling)是一种将函数或变量的名称转换为唯一标识符的过程。它主要用于解决C++中的一些复杂特性,例如重载、类的作用域、模板等。

2025-02-08 22:44:55 973 1

原创 c++面试:类定义为什么可以放到头文件中

在C++中,定义和声明是两个不同的概念,它们各自有着明确的用途和含义。理解这两者的区别对于编写正确且高效的C++代码至关重要。声明是指向编译器告知某个变量、函数或类的存在及其类型,但并不分配实际的存储空间。声明的主要目的是让编译器知道如何解析程序中的符号引用。例如:// 声明一个名为a的整型变量,但不分配内存// 声明一个名为add的函数,但不提供实现// 前置声明,仅声明了MyClass的存在声明允许你在代码的一个部分提到某个实体,并在另一个部分提供其实现或定义。

2025-01-27 23:25:38 1324 2

原创 git基础操作

可以看到有4个区域,remote就是远程仓库,workspace则是本地可以编辑的代码分支, repository就是本地的仓库,存储者远程代码分支,也存储者本地代码分支。

2024-11-08 22:39:48 1699

原创 递归基础训练-路径总和

二叉树在递归的时候会遍历每一个节点,走完所有的路径,我们可以把之前遍历的节点信息放到path中传递下去,一直到叶子节点就拿到了所有的路径# 如果为None就直接返回,比如一个节点左孩子是None,右孩子非空return# 搜索路径就是根节点到叶子节点,直接打印路径# 可以return也可以不return,因为根节点的左右子树都是None# 继续往下执行就是左子树dfs(None),右子树dfs(None)# return。

2024-09-17 23:45:22 837

原创 递归:深度优先搜索进阶

解决递归的思路非常的简单从上往下遍历到子节点就是递从下往上返回到根节点就是归。

2024-09-16 11:23:28 1057

原创 这是啥设计模式-观察者模式

召回算法有很多个模型,这些模型使用的都是同一份特征数据进行训练,当训练数据有更新的时候就调用每一个算法的train方法进行训练,生成最新的模型。基本思路就是把这些模型都放到一个数组中,当数据集有更新的时候,就遍历所有的模型执行训练老实讲,我觉的这种方案已经可以了,但是有一个小问题,就是数据更新之后应该通知每个模型。

2024-08-20 22:10:38 525

原创 这是啥设计模式-单例模式

召回算法中有一个叫做I2I的召回方式,给定一个Item,返回跟这个Item相似的topK个Item,这种相似关系一般在离线就计算好了,以KV的方式存储下来我们使用的时候也加载成kv的格式就可以了。

2024-08-18 22:13:14 391

原创 这是啥设计模式-组合模式

召回链路一般都是使用多路召回,例如文本召回,向量召回,KV召回等等。

2024-08-18 18:10:16 572

原创 这是啥设计模式-适配模式

有一个广告召回系统,输入用户id就可以给用户推荐相应的广告,一开始我们只有布尔检索和向量检索两种方式。

2024-08-16 23:49:17 501

原创 序列化与反序列化的本质

utf-8需要3个字节表示一个中文,但其实只需要2个字节就可以了,utf-8对中文而言也是有点浪费了,所以提出了gbk编码,只需要2个字节来表示中文。这里需要注意的是,utf-8是一种unicode的编码方式,打个比方,每个人的手机号都是11位的,但是如果你办了亲情网,只需要3位就可以标识自己的老公,老婆,父母了。我们请求网页的时候都会告知这个网页的编码方式,一般都是utf-8的,这样兼容性很好,任意字符都可以显示,也有gbk编码的。存储数据的过程就是序列化,解析数据的过程就是反序列化。

2024-07-26 22:57:34 1009

原创 python工作目录与文件目录

我们util目录中有一个view.py的文件,里面包含了一些工具类和方法# view.pyself.x = xself.y = y我们想要在train.py中调用该怎么办呢?我们以D:\test为工作目录,执行train.py文件,嘿嘿这是因为python在导入包的时候import xxx是以文件路径为基准的,即以train.py为基准,发现train.py的目录中并没有util子目录,因此导入失败。聪明的你做了一个简单的修改发现报了另一个错误。

2024-06-30 21:37:01 2496

原创 为什么需要负样本

人类学习的过程中好像只需要指出正样本就可以了,例如交宝宝学习认识猫咪,你告诉他这是猫咪就可以,不需要再告诉他其他的样本,好像自然而然就可以学会。其实人类在学习的时候一直都会有负样本的,例如识别猫咪的时候,桌子,椅子可能就是负样本,等到后面认识小狗的时候,猫咪,桌子椅子可能就是负样本了。假如我们只有正样本,模型在最开始训练的时候都是错误的,随着模型的迭代,准确率逐渐从0到1,最终将所有的样本都判别成正样本,也就是都在线的上方。加入负样本后,模型就可以知道不同类别之间的边界了,不会一股脑的把样本都识别成正的。

2024-06-13 22:28:35 503

原创 QPS,平均时延和并发数

我们当前有两个服务A和B,想要知道哪个服务的性能更好,该用什么指标来衡量呢?

2024-06-10 21:00:39 1578

原创 百万并发web服务器-简单的服务器

我们再本地实现了一个商品查询的服务,输入query,返回与之相关的商品。现在的问题是,如何搭建一个服务器,将这个服务提供给客户使用。一种最简单的方式就是使用socket实现一个服务器。Socket编程步骤使用c++来实现一个服务器接着实现一个客户端对于第一次使用socket编程来说,有太多不知道的东西了,一点一点梳理整个流程,对于服务端来说。

2024-04-28 23:34:15 800

原创 esp32+micropython蓝牙讲解

数字 M的四位表示 UUID 版本,当前规范有5个版本,M可选值为1, 2, 3, 4, 5。这5个版本使用不同算法,利用不同的信息来产生UUID,各版本有各自优势,适用于不同情景。UUID是一个 128 位无符号整数,通常使用十六进制字符串来表示,以连字号分隔的五组来显示,形式为 8-4-4-4-12,总共有 36个字符(即三十二个英数字母和四个连字号)。数字 N的一至四个最高有效位表示 UUID 变体( variant ),有固定的两位10xx因此只可能取值8, 9, a, b。

2023-10-06 20:56:08 10727 14

原创 ddp训练流程-pytorch教程

如果不同任务即使使用了同一个机器,即ip相同,也可以通过port来进行区分,可以看到192.168.1.2这台机器上跑了两个任务(这台机器有两个gpu,或者资源不够,用户就是想要指定两个进程来训练不同的任务),我们可以通过port来区分这两个任务,我们也可以使用一个不同的ip来区分,bert是192.168.1.2:5003,gpt是192.168.1.6:5003,端口一样,但是ip不一样,当然也可以直接ip+port都不相同。训练的过程中由于梯度共享的原因,所以每一次迭代梯度也是相同的。

2023-09-10 22:31:53 1275 1

原创 机器学习面试:tfidf&BM25的理解与应用

TFIDF的应用分析某个元素在整体中的重要性,元素可以是类目,单词等TFIDF的理解给你一篇文章,该如何确定文章中哪些词是关键的呢?一个直接的想法是对整篇文章进行分词,统计每个词出现的次数按照次数进行排序,出现次数越多的词重要性越高import jiebafrom collections import Counterdoc=""""""words = jieba.cut(doc)tf = Counter(words)tf = tf.most_common()print(tf

2023-05-13 18:47:44 777

原创 跟着杰哥学强化学习:自定义格子世界

现在的动作是随机,我们可以手动来操作扫地机器人进行运动。

2023-04-29 22:47:55 289

原创 跟着杰哥学强化学习:q-learning的一些思考

下一个状态next_s的down是1,right是-1,up和left都是0,所以更新s的时候q(s,a=‘right’) = q(s,a=‘right’) + (reward + max q(next_s, a) - q(s,a=‘right’))=0+(0+1)=1,我们发现根据下一个状态,当前的状态的某个动作也都有值了。四周的价值反馈都是0,根本不知道该往哪个方向移动是有价值的,(up,down,left,right)的值都是0,按照greedy的方式就会一直选择up,然后越界复位,循环往复。

2023-04-29 19:29:58 640

原创 跟着杰哥学强化学习:多臂老虎机问题

现在有3台外观一模一样的老虎机,每个老虎机的赔率是不同的,摇动一次需要1块钱,现在给你100块钱,如何获取最大的收益。如果我们知道了每个老虎的赔率,那么只要选择收益最高的那个老虎机就可以了,但现在问题是并不知道每个老虎机的收益。为了简单,我们假设老虎机的收益服从正态分布我们没有办法找到老虎机,但是可以用python来进行模拟。

2023-04-29 19:22:52 1053

原创 pygame入门教程-图像篇

可以看到返回的是一个surface。我们在创建一个窗口的时候返回的也是surface对象,所有想要显示的图像都需要加载到主窗口也就是screen上。pygame提供了一个blit函数可以将一个画布贴到另一个画布上source就是另一个surface,dest则是绘制在screen的坐标位置(x,y),area则是想要绘制图片的区域大小。

2023-04-02 21:49:48 3404

原创 pygame入门教程-绘制篇

由于是手动点击的,因此很难正好落在交叉点,可以判断点击位置距离哪个交叉点最近。我们先把所有的交叉的位置找出来。加入鼠标点击事件,点击左键就落子,即绘制一个圆。五子棋很简单,先绘制网格线,然后绘制圆就行了。

2023-04-01 22:19:09 425

原创 pygame入门教程-基础篇

我们先启动一个窗口我们通过设置了一个窗口,并且返回了一个screen的变量,这个变量的类型是,也就是一个画布。我们基于这个画布来作画,例如加载一个图片到这个画布上,或者绘制一个圆。

2023-04-01 21:37:38 1522

原创 Embedding-based Retrieval in Facebook Search

搜索引擎帮助用户在海量的信息中进行检索,google和bing开发了各种技术来提高搜索质量。由于语义和意图非常难以表征,因此当前的搜索大多依赖于term匹配方法,也就是关键字匹配。语义匹配:解决于查询文本不完全匹配但是可以满足用户搜索意图所需要的结果深度学习在语音,机器视觉和自然语言理解中取得了重大的进展。embedding即表征被证明是一种有效的方法。本质上来说embedding是一种将ids的稀疏向量表征为密集向量的方法,也被称为语义嵌入。

2023-03-04 22:15:25 1172

原创 hive建表基础知识

Hive的数据都是存储在HDFS上的,默认有一个根目录,在。

2023-02-10 14:52:03 202

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除