Category: 技术

C/C++ 中的内存管理器(堆与栈)

最近面试的时候遇到这个问题。这个问题考你计算机的基本功。 在 C/C++ 中,内存管理是控制程序如何分配和管理其资源的关键方面。C/C++ 程序中的内存通常分为不同的区域:堆栈和堆是最主要的动态和自动内存分配区域。 ACM题解系列之 – 最小堆栈 (Min Stack) 堆栈内存 定义:堆栈内存用于静态(自动)内存分配。它是存储函数参数、本地变量和返回地址的地方。当调用一个函数时,一个新的内存块(称为堆栈帧)会被添加到堆栈的顶部。当函数返回时,该内存会被自动释放。 分配:内存由系统自动管理——在变量超出作用域时自动分配和释放。无需人工干预。 生命周期:受限于函数或代码块的作用域。一旦函数退出,内存将被释放。 大小限制:堆栈的大小通常较小并由系统预定义,意味着大的分配可能导致堆栈溢出。 访问速度:由于其后进先出(LIFO)的结构,堆栈内存访问速度更快。由于内存是连续的且可预测的,它允许快速访问。 使用场景:局部变量、函数调用信息和固定大小的对象(数组、结构体)。 堆内存 定义:堆内存用于动态内存分配,程序员使用 C 中的 malloc()、calloc()、free() 和 C++ 中的 new、delete 手动分配和释放内存。 分配:内存在运行时分配,并且分配的生命周期由程序员手动控制。它可以持续存在,直到显式释放。 生命周期:堆分配的对象的生命周期不受作用域的限制。内存将一直被使用,直到被释放为止。 …

C++的 map 当键(Key)不存在的时候会发生什么?

在面试流程(例如筛选)的早期阶段,一位 Google 招聘人员曾向我问过这个问题。 在C++中,当你使用std::map访问一个不存在的键时,行为取决于你是如何访问它的。 使用下标操作符 访问时 如果键不存在,std::map 会默认插入一个该键的元素,并为其赋值为类型的默认值。比如,如果 map 的值类型是 int,那么它会插入该键并赋值为 0。 例子: std::map<int, int> myMap; int value = myMap; // 如果键10不存在,会插入myMap = 0 使用 at() 方法访问时 如果键不存在,at() 会抛出 …

Windows提高系统运行速度最简单粗暴的方法

我的顶配微软笔记本Surface Studio Pro都是不关的,浏览器几个个标签页,还加上其它SSH窗口几十个,系统感觉有点吃力,特别是Chrome浏览器很吃内存。 最近发现一个简单粗暴的方法,就是在系统/电源管理里(System/Power & Battery),有一个电源模式(Power Mode),选择最好的性能/Best Performance即可。默认的是”推荐性能”(Recommended Performance),还有中间一档是 Better Performance 较好的性能模式。 选择后,很快就听到了风扇起来的声音,一看任务管理器Task Manager,CPU的频率也在正常3G以上了。CPU是11th Gen Intel(R) Core(TM) i7-11370H @ 3.30GHz。 Windows默认的电源性能较为保守,CPU处理器的功率上不去,做工不行,性能当然上不去了。当解锁最佳性能后,给电增加功率,CPU高频工作,爽YY。 CPU 11th Gen Intel(R) Core(TM) i7-11370H @ 3.30GHz …

区块链中Layer 1和Layer 2协议的简介

Layer 1 和 Layer 2 是用来描述区块链技术中不同层次或层的术语,每个层都在维护和扩展区块链网络方面有其独特的作用和特点。 Steem的底层协议是C++写的,也就是steemd,见证人(也就是STEEM上的矿工)在自己的节点服务器上跑这个软件,共同运行这个区块链。steemd上支持一个custom_json操作,也就是可以调用API向区块链上写任何数据,这样的话,DApp分布式应用程序就可以在STEEM区块链上存储数据了,而在custom_json上的协议就是Layer 2/第二层。 Layer 1:基础协议 Layer 1 指的是区块链网络的基础层。它包括定义网络规则和操作的核心区块链技术。Layer 1的关键特性和组成部分包括: 共识机制 这是验证和添加到区块链中的交易的方法。流行的共识机制包括工作量证明(PoW)和权益证明(PoS)。 网络安全 Layer 1 负责区块链的整体安全。这包括防止双重支付或51%攻击等机制。 去中心化 网络的去中心化程度(网络在各个节点中的分布程度)在这一层确定。 原生加密货币 大多数Layer 1区块链都有自己的原生加密货币(如比特币或以太坊),用于交易和激励参与者。 可扩展性 这一层面临的主要挑战之一是可扩展性。因为每笔交易都在主链上处理和存储,高交易量会导致拥堵和交易费用增加。 升级和分叉 Layer …

随机数独游戏的算法设计 (Sudoku)

给定一个数独(Sudoku), 我们可以使用深度优先搜索算法(DFS), 迭代加深搜索算法(IDS)或广度优先搜索算法(BFS)来寻找可能的解. 反过来, 如果我们要设计一个算法来生成有效的数独, 我们需要澄清以下问题: 生成的数独(Sudoku)必须有可解状态吗? 是的 生成的数独(Sudoku)有多个解吗? 我们可以假设返回的Suduoku只有1个唯一解 生成的数独(Sudoku)的找解难度? 我们可以为此设置一个参数: 简单, 中等或困难 一共有6.671×10^21个有效的数独状态, 如果我们忽略旋转, 镜像状态等重复的状态, 这个数字就降到了5.4×10^9个状态. 我们可以随机生成一个由数字1-9填充的矩阵, 并检查它是否是有效的数独, 但这非常低效, 因为生成的矩阵极有可能不是有效的数独. 设计一个随机数独的算法 为了设计一个有效的算法, 生成一个随机的有效数独, 我们可以采用以下算法: 使用回溯(深度优先搜索)算法来生成一个具有随机性的有效完整数独. 例如, 我们可以随机选择数字, …

我儿子也会 Prompt Engineering

我的儿子们很兴奋地向我展示了使用微软必应(Bing)的”文本转图像(Image Creator)”功能. 他们说他们在Edge浏览器上的工具垂直栏上意外发现了这个功能. 微软必应(Bing)有给我和”图像创建器(Image Creator)”, 可以让您描述要绘制的内容. 提示工程 (Prompt Engineering)是人工智能(AI)中特别是自然语言处理(NLP)中的一个概念. 在提示工程中, 将AI应该完成的任务的描述嵌入到输入中, 例如作为问题, 而不是隐含地给出. 提示工程通常通过将一个或多个任务转换为基于提示的数据集, 并使用所谓的”基于提示的学习”或仅使用”提示学习”来训练语言模型来工作. 提示工程是一个全面的过程, 涵盖人与AI之间互动的整个周期. 它涉及对提示和基础数据结构的故意和系统的设计和改进, 以操纵AI系统朝着实现特定和期望的输出的方向发展. 随着ChatGPT(ChatGPT-3.5, ChatCPT-4甚至ChatGPT-5)成为热门话题, “提示工程”的需求日益增长. AI已经发展进化, 我们需要能够向AI提供具体的任务, 精确的要求(到位), 以便它可以完成任务. 许多职能/角色需要”提示工程”的技能. 无论是什么工作职能, 许多人在其职业道路上都可以成为提示工程师. …

Work Everywhere: 通过 railway 和 code-server 搭建网页版的 visual studio code

背景和需求 我有一个 iPad 平板, 平时出门碎片时间在 leetcode 和 binarysearch 上刷题, 因为可以直接在网页里敲代码. 除了用一些SSH Terminal远程登陆服务器用 vim 改代码, 平板上做开发并没有很好用的IDE. Code-Server 项目地址: https://github.com/cdr/deploy-code-server 通过这个项目可以在服务器 (VPS) 上配置 code-server, 通过 export 端口(8080) 可以在浏览器里以网页方式打开 vscode. Railway.app Serverless …