栈为何如此之快?
合集 · 直观理解计算机技术【CoreDumped】 (68)
-
代码中指定变量类型为何如此重要?
11:03
-
栈为何如此之快?
13:46
-
堆为何如此之慢?
17:53
-
动态数组的内部机制(ArrayList VS LinkedList)
19:56
-
探索计算机并发与多任务处理的历史
15:37
-
晶体管是如何运行代码的?
12:54
-
晶体管是如何记忆数据的?
16:12
-
制作一个CPU来运行程序
18:47
-
计算机如何将字符串转换为数字
11:23
-
动态随机存取存储器(DRAM)的工作原理
17:18
-
计算机处理器是如何运行条件和循环的?
16:05
-
一个程序不是一个进程
6:51
-
深入理解进程,如何进行上下文切换?计算机科学中最深刻和最成功的想法之一。
14:52
-
处理器内部的单个位如何保护操作系统的完整性?
20:20
-
计算的心跳:时钟如何推动 CPU 前进?
13:14
-
英语原声版-计算的心跳:时钟如何推动 CPU 前进?
14:22
-
(英语原声)进程间通信:共享内存或发送消息
14:15
-
(中文配音)进程间通信:共享内存或发送消息
12:29
-
(中文配音)为什么单核处理器需要线程?
14:59
-
(英语原声)为什么单核处理器需要线程?
16:07
-
(中文配音)多核系统上的线程
9:26
-
(英语原声)多核系统上的线程
11:27
-
(中文配音)为什么应用程序是特定于操作系统的?
11:52
-
(英语原声)为什么应用程序是特定于操作系统的?
13:09
-
(英语原声)硬件如何在多任务处理中协助软件?
13:15
-
(中文配音)硬件如何在多任务处理中协助软件?
11:29
-
链表的一个实际应用
20:34
-
让你的电脑运行更流畅的奇妙算法
45:02
-
(流畅中文配音)让你的电脑运行更流畅的奇妙算法
43:38
-
(原声双语字幕)当程序调用 sleep() 时会发生什么?
19:41
-
(流畅中文配音)当程序调用 sleep() 时会发生什么?
17:57
-
这个简单算法驱动了真正的解释器:Pratt Parsing
20:40
-
(双语字幕)编程中最难以捉摸的Bug:竞态条件
18:19
-
(流畅中文配音)编程中最难以捉摸的Bug:竞态条件
19:23
-
(中文配音)阻止内存攻击的底层电路
16:02
-
(英语原声)阻止内存攻击的底层电路
14:51
-
为什么有些项目会使用多种编程语言?
18:04
-
为什么有些项目会使用多种编程语言?
19:32
-
别再杀进程了!让 Ctrl+C 变成“喵”……(用信号实现)
17:15
-
别再杀进程了!让 Ctrl+C 变成“喵”...(用信号实现)
19:23
-
80 年代避免竞态条件的算法(以及它为何失败)
19:05
-
80 年代避免竞态条件的算法(以及它为何失败)
19:43
-
CPU如何与众多不同设备交互?
22:10
-
(中文配音)CPU如何与众多不同设备交互?
23:52
-
(中文配音)你每天都在用的奇特CPU操作
14:04
-
你每天都在用的奇特CPU操作
13:04
-
(中文配音)历史如何塑造了我们今天仍在使用的编程术语?
18:04
-
(英语原声)历史如何塑造了我们今天仍在使用的编程术语?
17:42
-
为什么有些底层项目里会充满这种奇怪的代码?
16:41
-
(中文配音)为什么有些底层项目里会充满这种奇怪的代码?
16:39
-
编译与解释代码如何共处同一程序中?
21:35
-
(英语原声)编译与解释代码如何共处同一程序中?
21:30
-
【双语字幕】Core Dumped 常见问题的集中回答
17:09
-
【双语字幕】90年代的设计决策阻碍了Python并行化
13:36
-
【中文配音】90年代的设计决策阻碍了Python并行化
12:01
-
Linux创建进程的奇怪方式
17:51
-
【中文配音】Linux创建进程的奇怪方式
18:14
-
CPU如何运行函数?
19:49
-
【中文配音】CPU如何运行函数?
19:38
-
没有人解释的问题:内核的边界在哪里?
17:15
-
【英语原声】没有人解释的问题:内核的边界在哪里?
19:36
-
硬件如何让线程问题不再那么棘手?
35:49
-
为什么在macOS、Windows和Linux上安装应用程序如此不同?
19:47
-
游戏公司真的能破坏你的电脑吗?
24:00
-
一个视频说透“架构”:为什么你的程序换个CPU就可能跑不了?
10:43
-
CPU如何执行有符号和无符号运算?
14:45
-
简单指令, 奇妙算法
19:11
-
当CPU遇到它不认识的指令,会发生什么?😱【底层原理】
9:26
Description
在这个视频中,我们将深入探讨编程中的一个重要概念——栈(Stack)。你是否曾好奇为什么大家都推荐将数据放在栈上?或者你是否疑惑为什么编译器在处理数组时需要你明确指定大小?本视频将为你揭晓答案。 我们将从栈的基本工作原理开始,解释其后进先出(LIFO)的特性以及它如何高效地管理内存。然后,我们会探讨操作系统在内存管理中的角色,以及如何通过栈来避免内存碎片化和提高缓存命中率,从而提升程序性能。
Comments
写入的时候直接覆盖,删的时候改改栈顶指针就行,可不快吗[doge]
♥ 221 ↩ 6
他不仅快,还很短
♥ 213 ↩ 5
看了开头:嗯?这 struct 的语法,c++ 又更新新的语法了??[辣眼睛] 直奔评论区:哦,原来是 rust[笑哭]
♥ 69 ↩ 8
用个人浅薄的知识尝试总结一下: 优点: 1.栈主要是为了让数据变得紧凑,让CPU更好的去读取数据(减少内存浪费+增加命中概率) 缺点: 1.栈的大小会有限制(是一开始就申请好了所以有限制?) 2.只支持固定大小的类型,因为栈中的变量在内存上是连续的,所以如果它的大小发生了改变,数据的修改会直接影响到其他的变量 3.栈是单线程,不支持跨线程使用
♥ 62 ↩ 8
我觉得应该进一步说一下栈和缓存的关系。对于多数应用来说,开辟和销毁内存的代价其实占比并不高。影响性能的主要是函数内直接声明的短且固定长度的数组通常会被保留在L1 Cache中,由于它是距离寄存器最近的存储,即便随机读写也快的一批;而对于堆上开辟的空间,通常来说尺寸较大,会被保留在更高级的Cache甚至是MEM中,但基本不会被放在L1 Cache上。一个很简单的实验可以证明这一点:在栈上和堆上分别开辟尽可能大的相同尺寸的内存,然后分别进行矩阵乘法或矩阵向量乘法的计算,性能差别是很明显的~
♥ 65 ↩ 15
linux的栈只有8M,而堆基本想要多大就有多大,动动脚趾也能猜到,这8兆肯定非常珍贵,必然也是特别快的[doge]
♥ 46 ↩ 4
这个东西要看abi文档。至于cpu缓存知识要看计算机硬件原理。
♥ 25
视频是搬运的吧?需要标出来源。 视频内容与标题的无关内容过多,并且我认为完全没有说到点上,根本不需要讲操作系统、虚拟内存、数组分配、类型声明,执行演示等等,没啥关系,过于基础,还不能说明问题。 栈快完全是因为CPU缓存与命中率,栈是一小块连续内存,并且因频繁访问,一直处于CPU缓存中,相当于连续访问,要知道现在CPU缓存的速度可以达到几个T每秒,延迟个位数纳秒,而最快的D5内存速度也就100G,延迟还数十倍于缓存,相较之下缓存命中率高的栈能不快吗? 视频那么长,扫过去都没看到哪强调了这点,图里画了cache却没讲,真的是要气死,答案就在眼皮子底下溜走。 了解了缓存的作用后,可以指导循环遍历的高效写法,典型的如遍历二维数组图像,明显行遍历和列遍历的性能会存在差异,行遍历可以实现顺序访问,提高缓存命中率,获得最快的内存访问,列遍历就因为指针跳变,有缓存失效性能变差的风险,这是视频内容所不能解释和扩展的
♥ 19 ↩ 4
用数字电路的硬件物理视角去理解这些知识更直观明了,不要用这些软件的抽象思维去理解,越理解越绕。
♥ 19 ↩ 1
物理总线
♥ 18
和住旅馆似的[doge],上一个刚交房啪一下下一个客人立马入住
♥ 14 ↩ 2
没操作系统都没堆的概念好吧[doge]。更上层语言的可变数组也只是大组套小组罢了。[doge]
♥ 10
stackoverflow死了?哈哈,我还没用过呢[笑哭]
♥ 9 ↩ 3
不好意思,看成了钱为什么如此之快,点进来了。。。
♥ 8 ↩ 1
(int *)malloc(sizeof(int)*n);
♥ 5 ↩ 7
stackoverflowexception
♥ 5
内存不是无限大,这样说会引起误解。64位系统程序的内存上限是2的64次方。
♥ 4 ↩ 9
字对齐对于性能优化是有作用的,而紧凑形数据会打乱他,这里说的栈应该没有考虑字宽的问题,在实际编程中,处理非对齐数据的方式往往需要两次读写,有些cpu没有这类硬件功能他们往往借助编译器来处理,有时候则是会直接抛出异常。
♥ 3
栈桢是不是可以简单的理解为标识不同函数调用时的信息。
♥ 3 ↩ 2