(delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)

13.1 全局数据、栈和堆**

​ 任何平台上的任何 Object Pascal 应用程序所使用的内存可以分为两个部分:代码和数据。就代码部分而言,程序可执行文件的指令部分、资源(如位图和窗体描述)以及程序使用的库都加载到其内存空间中。这些内存块是只读的,并且在某些平台(如 Windows 上)它们可以在多个进程之间共享。

​ 更有趣的是数据部分。Object Pascal 程序的数据(与大多数其他语言编写的程序一样)存储在三个明显不同的区域中:全局内存、栈和堆。

13.1.1 全局内存

​ 当 Object Pascal 编译器生成可执行文件时,它会程序在整个生命周期中存储存变量所需的空间。在一个Unit的interface或implementation中声明的全局变量属于此类别。请注意,如果全局变量是类类型(也包括字符串或动态数组),则只存储全局内存中的 4 字节或 8 字节对象引用。

​ 您可以在编译程序后使用 Project | Information 菜单项来确定全局内存的大小。您要查看的具体字段是数据大小。图 13.1 显示了近 50K 全局数据(48,956 字节)的使用情况,其中包括程序及其使用的库的全局数据。

图 13.1:已编译程序的信息

​ 全局内存有时被称为静态内存,因为一旦程序加载,变量将保留在原来的位置,因此在程序的生命周期内永远不会释放这些内存。

13.1.2

​ 栈是一个动态内存区域,按照后进先出(LIFO)的顺序分配和删除内存。这意味着你最后分配的内存对象将最先被删除。图 13.2 是堆栈内存的示意图。

​ 通常,过程、函数和方法调用使用栈传递参数及其返回值,以及声明在函数或方法中的局部变量。一旦例程调用结束,栈上的内存区域就会被释放。请记住,Object Pascal 默认使用寄存器调用约定,即尽可能在 CPU 寄存器而不是栈中传递参数。

图 13.2:栈内存区域的表示

​ 还要注意的是,为了节省时间,栈内存通常不会被初始化或清理。这就是为什么如果将一个整数声明为局部变量,然后读取它的值,却不知道它的值是多少。这就是为什么所有局部变量在使用前都需要初始化的原因。

​ 栈的大小通常是固定的,由编译过程决定。您可以在 Project | Options 的 linker 页面设置该参数。不过,默认值通常就可以了。如果你收到 "堆栈溢出 "的错误信息,很可能是因为有函数一直递归调用自己,而不是因为栈空间有限。Project | Information 对话框提供的另一条信息是初始栈大小。

13.1.3 堆

​ 堆是以随机顺序分配和回收内存的区域。这意味着,如果您按顺序分配了三个内存块,它们以后可能以任何顺序被销毁。堆管理器会处理所有细节,因此你只需使用底层的 GetMem 函数或调用构造函数来创建对象,系统就会为你返回一个新的内存块(可能会重复使用已丢弃的内存块)。Object Pascal 使用堆为每个对象、字符串文本、动态数组以及大多数其他数据结构分配内存。

​ 由于堆是动态的,因此堆是程序出问题最多的内存区域:

  • 每创建一个对象,都需要将其销毁。如果不这样做,就会发生 “内存泄漏”,除非反复发生,直到堆内存消耗殆尽,否则不会造成太大危害。
  • 每次销毁对象时,都必须确保不再使用该对象,而且程序不会再次销毁该对象。
  • 动态创建的任何其他数据结构也是如此,但Object Pascal语言运行时基本上是自动处理字符串和动态数组,所以你几乎不用担心这些问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/14806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TypeScript 学习笔记(三):模块系统与命名空间

1. 引言 在前两篇学习笔记中,我们介绍了 TypeScript 的基础知识和高级类型系统。本篇将重点讲解 TypeScript 的模块系统与命名空间,帮助你理解如何组织代码、管理依赖以及与 JavaScript 互操作。 2. 模块系统 TypeScript 支持两种模块系统&#xff1a…

Debezium+Kafka:Oracle 11g 数据实时同步至 DolphinDB 解决方案

随着越来越多用户使用 DolphinDB,各式各样的应用场景对 DolphinDB 的数据接入提出了不同的要求。部分用户需要将 Oracle 11g 的数据实时同步到 DolphinDB 中来,以满足在 DolphinDB 中实时使用数据的需求。本篇教程将介绍使用 Debezium 来实时捕获和发布 …

npm介绍、常用命令详解以及什么是全局目录

目录 npm介绍、常用命令详解以及什么是全局目录一、介绍npm的主要功能npm仓库npm的配置npm的版本控制 二、命令1. npm init: 初始化一个新的Node.js项目&#xff0c;创建package.json文件。package.json是一个描述项目信息和依赖关系的文件。2. npm install <package_name&g…

LeetCode算法题:42. 接雨水(Java)

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…

基于vue3速学angular

因为工作原因&#xff0c;需要接手新的项目&#xff0c;新的项目是angular框架的&#xff0c;自学下和vue3的区别&#xff0c;写篇博客记录下&#xff1a; 参考&#xff1a;https://zhuanlan.zhihu.com/p/546843290?utm_id0 1.结构上&#xff1a; vue3:一个vue文件&#xff…

python:pycharm虚拟解释器报错环境位置目录为空

目录 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; pycharm解释器 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; 切换到解释器下 激活解释器 查看解释器 where python 激活成功 这时在控制台使用python xxx.py 可以…

卷积神经网络和误差反向传播如何一起工作

用更简单的方式来理解卷积神经网络&#xff08;CNN&#xff09;和误差反向传播法&#xff08;一种梯度下降的应用方式&#xff09;是如何一起工作的&#xff0c;这次我们用一个找宝藏的游戏来比喻&#xff1a; 游戏背景&#xff1a;寻宝图的秘密 想象你有一张藏宝图&#xff…

​​​【收录 Hello 算法】10.1 二分查找

目录 10.1 二分查找 10.1.1 区间表示方法 10.1.2 优点与局限性 10.1 二分查找 二分查找&#xff08;binary search&#xff09;是一种基于分治策略的高效搜索算法。它利用数据的有序性&#xff0c;每轮缩小一半搜索范围&#xff0c;直至找到目标元素或搜索区间为空…

C++中的类型转换

文章目录 C中的四种类型转换static_castreinterpret_castconst_castdynamic_cast RTTI C中的四种类型转换 C语言中已经存在类型转换了&#xff0c;为什么C还要提出自己风格的类型转换&#xff1f; C风格的转换格式很简单&#xff0c;但是有不少缺点的&#xff1a; 转换的可视…

​​​【收录 Hello 算法】第 10 章 搜索

目录 第 10 章 搜索 本章内容 第 10 章 搜索 搜索是一场未知的冒险&#xff0c;我们或许需要走遍神秘空间的每个角落&#xff0c;又或许可以快速锁定目标。 在这场寻觅之旅中&#xff0c;每一次探索都可能得到一个未曾料想的答案。 本章内容 10.1 二分查找10.2 二…

【如何检查 ONNX 模型是否正确?】onnx.checker.check_model 用法详解

以下是对 onnx.checker.check_model 函数文档的翻译&#xff1a; onnx.checker.check_model 检查模型的一致性&#xff0c;即模型在结构、格式和配置方面的正确性和完整性。 如果模型的 ir_version 设置不正确或高于检查器的 ir_version&#xff0c;或者模型在 metadata_pro…

Java序列化解密:技巧、陷阱与最佳实践

1. 概述Java序列化的概念与应用场景 1.1 序列化简介 在Java中&#xff0c;序列化机制允许我们将一个对象状态转换为一串字节序列&#xff0c;并可在稍后再将这串字节序列恢复为对象。这一特性极大地方便了对象的持久化处理与网络传输。 1.2 为何需要序列化 序列化主要用于两…

恶劣天候激光雷达点云模拟方法论文整理

恶劣天候点云模拟方法论文整理 模拟雨天点云&#xff1a;【AAAI2024】模拟雪天点云&#xff1a;【CVPR 2022 oral】模拟雾天点云&#xff1a;【ICCV2021】模拟点云恶劣天候的散射现象&#xff1a;【Arxiv 2021】模拟积水地面的水花飞溅点云&#xff1a;【RAL2022】 模拟雨天点云…

C#面:如何在.Net(C# )中如何取消一个窗体的关闭

可以通过重写窗体的Closing事件来取消窗体的关闭 private void Form1_Closing(object sender, CancelEventArgs e) {// 取消窗体的关闭e.Cancel true; } 在窗体的构造函数中&#xff0c;可以将Closing事件与上述方法进行关联&#xff1a; public Form1() {InitializeCompon…

蓝桥杯Web开发【模拟题三】15届

1.创意广告牌 在"绮幻山谷"的历史和"梦幻海湾"的繁华交汇之处&#xff0c;一块创意广告牌傲然矗立。它以木质纹理的背景勾勒出古朴氛围&#xff0c;上方倾斜的牌子写着"绮幻山谷的风吹到了梦幻海湾"&#xff0c;瞬间串联了过去与现在&#xff0…

EPIC免费领取《骑士精神2》 IGN9分神作骑士精神2限时免费领

EPIC免费领取《骑士精神2》 IGN9分神作骑士精神2限时免费领 最近Epic一直为玩家们送出各种游戏&#xff0c;从《龙腾世纪审判》到《模拟农场22》&#xff0c;而就在今天&#xff0c;epic又为玩家们送出了IGN评分9分高分的骑士精神2.这款游戏&#xff0c;该游戏是一款由Tripwir…

软考之信息系统管理:数据结构和算法

数据结构和算法 数据结构&#xff1a;数据的特性和数据之间存在的关系&#xff1b; 数据结构常用名词和术语&#xff1a; 数据是人们利用文字&#xff0c;数字等符号对现实世界的事物及其活动所做的描述数据元素简称元素&#xff0c;是数据的基本单位&#xff0c;通常作为一个整…

考研408操作系统篇-操作系统的基本概念1

操作系统的基本概念 操作系统的目标与应用环境有关。 在查询系统中人机交互性&#xff1b;应用于工业控制、武器控制以及多媒体环境下的OS&#xff0c;要求其具有实时性&#xff1b; 对于微机上的配置的OS&#xff0c;则更看重的是其使用的方便性 操作系统的目标 方便性&…

阿赵UE引擎C++编程学习笔记——常用容器TArray、TMap和TSet

大家好&#xff0c;我是阿赵   这次来熟悉一下UE引擎在写C时的一些特定的容器。 主要有三种&#xff0c;分别是TArray、TMap和TSet 一、 TArray TArray是标准的数组&#xff0c;通过下标来访问内容。数组里面的元素是可以重复的。   以下是TArray的一些用法举例&#xff1…

vue连接mqtt实现收发消息组件超级详细

基本概念&#xff1a; MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种基于发布/订阅模式的轻量级消息传输协议&#xff0c;专为低带宽、高延迟或不稳定的网络环境设计。以下是MQTT实现收发消息的基本原理&#xff1a; 客户端-服务器模型&#xff1a…