(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类型实例化)

14.2.3 泛型类型实例化

​ 请注意,这是一个相当高级的一节内容,重点关注泛型的一些内部细节及其潜在的优化。如果这是您第一次学习泛型,那么建议您多读一遍。

​ 除了一些优化之外,每次实例化泛型类型时,无论是在方法中还是在类中,编译器都会生成一个新的类型。这种新类型不会与同一泛型的不同实例(或同一方法的不同版本)共用代码。。

​ 以下是一个示例(它是GenericCodeGen示例的一部分)。该程序定义了一个泛型类:

typeTSampleClass<T> = classprivateFData: T;publicprocedure One;function ReadT: T;procedure SetT(Value: T);end;

​ 这三个方法的实现如下(请注意,One方法与泛型类型完全无关):

procedure TSampleClass<T>.One;
beginForm30.Show('OneT');
end;function TSampleClass<T>.ReadT: T;
beginResult := FData;
end;procedure TSampleClass<T>.SetT(Value: T);
beginFData := Value;
end;

​ 现在主程序主要使用泛型类型来计算编译器生成实例的方法的内存地址。这是代码:

procedure TForm30.Button1Click(Sender: TObject);
varT1: TSampleClass<Integer>;T2: TSampleClass<string>;
beginT1 := TSampleClass<Integer>.Create;T1.SetT(10);T1.One;T2 := TSampleClass<string>.Create;T2.SetT('Hello');T2.One;Show('T1.SetT: ' +IntToHex(PInteger(@TSampleClass<Integer>.SetT)^, 8));Show('T2.SetT: ' +IntToHex(PInteger(@TSampleClass<string>.SetT)^, 8));Show('T1.One: ' +IntToHex(PInteger(@TSampleClass<Integer>.One)^, 8));Show('T2.One: ' +IntToHex(PInteger(@TSampleClass<string>.One)^, 8));
end;

结果大致如下(实际值会有所不同):

T1.SetT: C3045089
T2.SetT: 51EC8B55
T1.One: 4657F0BA
T2.One: 46581CBA

​ 正如我预料的那样,编译器不仅会为每个使用的不同数据类型SetT方法在内存中生成的不同版本,而且即使是完全相同的方法,如One方法也会这样做。

​ 此外,如果重新声明相同的泛型类型,则会获得一组新的实现函数。同样,在不同单元中使用相同的泛型类型实例会强制编译器一遍又一遍地生成相同的代码,可能会导致显著的代码膨胀。因此,如果您有一个泛型类有许多不依赖于泛型类型的方法,则建议定义一个具有这些公共方法的非泛型基类,并具有泛型方法的继承泛型类:这样基类方法只编译一次并包含在可执行文件中。

注解:目前正在进行编译器、链接器和底层RTL方面的工作,以减少在本节所概述的泛型引起的大小增加这种情况。例如,请参见http://delphisorcery.blogspot.it/2014/10/new-language-feature-in-xe7.html中的考虑。

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

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

相关文章

[沉迷理论]进制链表树

往期文章推荐&#xff1a; 题解之最大子矩阵-CSDN博客 洛谷P1115最大子段和[神奇的题目]-CSDN博客 &#xff08;一条神奇的分割线&#xff09; 前言 好久没有更新的我总算在百忙之中抽出时间写了篇博客。 最近总算结束了动态规划的学习&#xff0c;真的是头昏脑涨啊。 最…

45.django - 开始建立第一个项目

1.django是什么&#xff1f; Django是一个高级的、免费的、开源的Web应用框架&#xff0c;它由Python编程语言编写而成。Django遵循模型-视图-控制器&#xff08;MVC&#xff09;的设计模式&#xff0c;但通常将其称为模型-视图-模板&#xff08;MVT&#xff09;架构。它的主要…

Silanna UV光荣推出了一款革命性的高功率远紫外线LED

这款令人瞩目的光源&#xff0c;拥有令人震撼的235nm波长&#xff0c;并被巧妙地封装在紧凑的6.8mm结构中&#xff0c;其魅力与实力兼具。 今年六月&#xff0c;在苏格兰圣安德鲁斯大学举行的盛大2024年远紫外科学和技术国际大会&#xff08;ICFUST&#xff09;上&#xff0c;S…

华为坤灵路由器配置telnet

在用户视图下执行命令install feature-software WEAKEA安装弱安全算法/协议特性包&#xff08;WEAKEA&#xff09;。配置Telnet服务器的管理网口IP地址。 <HUAWEI> system-view [HUAWEI] sysname Telnet Server [Telnet Server] interface meth 0/0/0 [Telnet Server-ME…

[一] 解释自己思维判断与行为 - 《情报分析心理学》读后感

读后记第一篇 以下大部分内容并非直接来自翻译&#xff0c;均为笔者学习阅读后书面、口述语言 我们将通过未曾接触过的情报分析心理学 认知心理学角度上认识并解释自己 前言 网络安全与情报学的融合 花了一周多的时间学习完了《情报分析心理学》&#xff0c;正如书中所讲的…

######## redis各章节终篇索引 ############

1、数据结构 关系&#xff1a; zset&#xff1a;ziplist&#xff08;注意是可变长度的&#xff0c;下同&#xff09;、skiplist hash&#xff1a;ziplist、hashTable&#xff08;是一种子结构&#xff0c;区别于hash&#xff09; set&#xff1a;inset&#xff08;有序列表&…

C# WPF入门学习主线篇(十七)—— UniformGrid布局容器

C# WPF入门学习主线篇&#xff08;十七&#xff09;—— UniformGrid布局容器 欢迎来到C# WPF入门学习系列的第十七篇。在前几篇文章中&#xff0c;我们已经探讨了 Canvas、StackPanel、WrapPanel、DockPanel 和 Grid 布局容器及其使用方法。本篇博客将介绍另一种非常实用且简单…

多目标检测模型加权框集成

优秀项目推荐&#xff1a;https://gitcode.com/ZFTurbo/Weighted-Boxes-Fusion/overview 参考链接&#xff1a; 目标检测加权框融合 WBF原理讲解 https://blog.csdn.net/YXD0514/article/details/132574588 目标检测加权框融合 WBF原理讲解&#xff08;Weighted Boxes Fusion&…

程序员的电工基础

什么是“强电”、什么是“弱电” 强电指的是动力线&#xff0c;弱电指的是信号线&#xff08;数据线&#xff09;。不是指电压高低。 历史上强电一般是较高的电压&#xff0c;典型的&#xff0c;大部分国家标准电压是220伏&#xff0c;三相电机采用三相四线或三相三线驱动&…

LVGL移植和图片显示

最近闲来无事&#xff0c;偶尔刷到了移植LVGL的教程&#xff0c;今天肝完了机械原理又移植完LVGL库&#xff0c;真是收获满满的一天&#xff0c;先接一杯水去。 回来了&#xff0c;发个朋友圈高级一下&#xff0c;好困。 lvgl v8.3移植及组件使用_lvgl界面编辑器-CSDN博客htt…

插卡式仪器模块:音频分析模块(插卡式)

• 24 位分辨率 • 192 KHz 采样率 • 支持多种模拟音频信号的输入/输出 应用场景 • 音频信号分析&#xff1a;幅值、频率、信噪比、THD、THDN 等指标 • 模拟音频测试&#xff1a;耳机、麦克风、扬声器测试&#xff0c;串扰测 音频分析仪 输入阻抗10 TΩ10 TΩ输入范围3…

vue如何使用slot

1. vue2 如何使用slot 1.1. 默认插槽&#xff08;Default Slot&#xff09;1.2. 具名插槽&#xff08;Named Slot&#xff09;1.3. 作用域插槽&#xff08;Scoped Slot&#xff09; 2. vue3 如何使用slot 2.1. 默认插槽&#xff08;Default Slot&#xff09;2.2. 具名插槽&…

Visual Studio 调试反汇编c++/c

目录 一、代码打断点 二、开启调试 三、调试反汇编 一、代码打断点 如下图所示&#xff1a; 二、开启调试 三、调试反汇编 代码调试成功后&#xff0c;打开窗口下的反汇编就可以查看我们的反汇编代码了。

python批量调整word含有关键字句子样式

代码&#xff1a; from docx import Document from docx.shared import RGBColor obj Document(装机必读调整样式.docx) word 软件 def set_run(run):#设置run的字体大小、是否加粗以及字体颜色run.font.size font_sizerun.bold boldrun.font.color.rgb color for p in obj.…

CentOS安装Python 3.10跳坑记

笔者在一台 CentOS 7.9 服务器上升级 Python 3.10 后&#xff0c;运行 pip3.10 安装依赖库总是报错&#xff1a; There was a problem confirming the ssl certificate: HTTPSConnectionPool(hostpypi.org, port443): WARNING: pip is configured with locations that require…

深入了解FAT文件系统

FAT&#xff08;File Allocation Table&#xff0c;文件分配表&#xff09;文件系统是由微软开发的一种简单高效的文件系统格式。它广泛应用于各种存储设备&#xff0c;如U盘、SD卡等。本文将详细介绍FAT文件系统的关键术语、结构和功能实现&#xff0c;帮助读者全面了解这一经…

DP:回文串模型

一、回文子串 . - 力扣&#xff08;LeetCode&#xff09; 该题有3种解法 &#xff08;1&#xff09;中心扩展算法&#xff08;在字符串章节有介绍&#xff09;时间复杂度O&#xff08;N^2&#xff09;,空间复杂度O&#xff08;1&#xff09; &#xff08;2&#xff09;马丁车…

Spring AI 第二讲 之 Chat Model API 第六节Google VertexAI API

VertexAI API 可提供高质量的定制机器学习模型&#xff0c;只需花费最少的机器学习专业知识和精力。 Spring AI 通过以下客户端提供与 VertexAI API 的集成&#xff1a; VertexAI Gemini Chat Vertex AI Gemini API 允许开发人员使用 Gemini 模型构建生成式人工智能应用程序。…

Apollo9.0 PNC源码学习之Control模块(一)

0 前言 从planning的角度看control&#xff0c;首先需要了解的就是相关的数据接口&#xff0c;规划出的轨迹&#xff08;路径速度&#xff09;发给Control模块去执行 modules/planning/planning_component/planning_component.cc planning模块发布轨迹信息 planning_writer_ …

利用CSS隐藏HTML元素并插入替代内容

在创建一个支持切换阅读模式和答题模式的Anki问答题模板中&#xff0c;我创建了一个支持切换阅读模式和答题模式的问答题模板&#xff0c;该文最终利用JavaScript将Anki输出的向下箭头删除&#xff0c;并插入自定义的提示语。经过进一步测试&#xff0c;发现实现上述功能完全不…