- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在德尔福 理智 人们使用 class
来定义对象。
在 Windows 版 Turbo Pascal 中,我们使用了 object
今天你仍然可以使用 object
创建一个对象。
不同之处在于object
生活在堆栈上,还有一个 class
住在堆上。
当然还有 object
被贬值了。
抛开这一切:
使用 object
有什么好处吗?而不是类?
我知道object
在 Delphi 2009 中已损坏,但我有一个特殊用例 1),其中速度很重要,我正在尝试查找是否使用 object
会让我的事情更快,而不会让它变得有问题
此代码库在 Delphi 7 中,但我可能会将其移植到 Delphi 2007,尚未决定。
1)康威的人生游戏
长评论
感谢大家为我指出正确的方向。
让我再解释一下。我正在尝试更快地实现 hashlife , see also here或 here for simple sourcecode
目前的记录保持者是 golly ,但是 golly 使用了 Bill Gospher 原始 lisp 代码的直接翻译(作为一种算法非常出色,但根本没有在微观层面进行优化)。 Hashlife 使您能够在 O(log(n)) 时间内计算一代。
它通过使用空间/时间权衡来做到这一点。出于这个原因,hashlife 需要大量内存,千兆字节并非闻所未闻。作为返回,您可以使用第 2^127 代 (17014118346046923173168730370000)000000) 计算第 2^128 代 (340282366920938463463374607431770000000)。
因为 hashlife 需要为以更大模式出现的所有子模式计算哈希,所以对象的分配需要快速。
这是我确定的解决方案:
分配优化
我分配了一大块物理内存(用户可设置),比如说 512MB。在这个 blob 中,我分配了我所说的 奶酪堆 .这是一个普通的堆栈,我在其中推送和弹出,但弹出也可以来自堆栈的中间。如果发生这种情况,我会将其标记在 free
上列表(这是一个普通的堆栈)。插入时,我检查了 free
如果没有任何东西是免费的,我会像往常一样推送。我将按照建议使用记录,它看起来像是开销最少的解决方案。
由于 hashlife 的工作方式,很少 pop
发生 ping 和很多 push
es.我为不同大小的结构保留单独的堆栈,确保在 4/8/16 字节边界上保持内存访问对齐。
其他优化
inline
最佳答案
要使用正常的 OOP 编程,您 应始终使用 class
种类 .您将拥有 Delphi 中最强大的对象模型,包括接口(interface)和泛型(在更高的 Delphi 版本中)。
1.记录、指针和对象
记录可能是邪恶的(如果您忘记将参数声明为 const
,则记录隐藏缓慢,记录隐藏的缓慢清理代码,fillchar
会使记录中的任何字符串成为内存泄漏...),但它们有时非常通过指针方便地访问二进制结构(例如一些“小值”)。
一个动态的小记录数组(例如一个整数和一个 double 字段)将是 多比 TList
快小类授课;与 our TDynArray
wrapper ,您将拥有对记录的高级访问权限,包括序列化、排序、散列等。
如果使用指针,您必须知道自己在做什么。坚持使用类绝对更可取,而且 TPersistent
如果您想使用神奇的“VCL 组件所有权模型”。
记录不允许继承。您要么需要使用“变体记录”(在其类型定义中使用 case
关键字),要么使用嵌套记录。使用类 C API 时,有时必须使用面向对象的结构。恕我直言,使用嵌套记录或变体记录远不如旧的“对象”继承模型清晰。
2. 何时使用对象
但是在某些地方,对象是访问现有数据的好方法。
甚至对象模型也比新的记录模型更好,因为它处理简单的继承。
在 a Blog entry last summer ,我发布了一些仍然使用对象的可能性:
type TObj = object Int: integer; Str: string; end;
procedure Test;
var O: TObj
begin // here, an _InitializeRecord(@O,TypeInfo(TObj)) call is made
O.Str := 'test';
(...)
end; // here, a _FinalizeRecord(@O,TypeInfo(TObj)) call is made
_InitializeRecord
和
_FinalizeRecord
将“准备”然后“释放” O.Str 变量。
/// used to store and retrieve Words in a sorted array
// - is defined either as an object either as a record, due to a bug
// in Delphi 2010 compiler (at least): this structure is not initialized
// if defined as a record on the stack, but will be as an object
TSortedWordArray = {$ifdef UNICODE}record{$else}object{$endif}
public
Values: TWordDynArray;
Count: integer;
/// add a value into the sorted array
// - return the index of the new inserted value into the Values[] array
// - return -(foundindex+1) if this value is already in the Values[] array
function Add(aValue: Word): PtrInt;
/// return the index if the supplied value in the Values[] array
// - return -1 if not found
function IndexOf(aValue: Word): PtrInt; {$ifdef HASINLINE}inline;{$endif}
end;
{$ifdef UNICODE}record{$else}object{$endif}
太糟糕了......但是代码生成错误没有发生,因为......
关于delphi - 在 Delphi 中使用旧式 `object` 而不是 `class` 有好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6103747/
请在标记为重复之前阅读。 我正在创建一组依赖智能卡进行身份验证的应用程序。到目前为止,每个应用程序都单独控制智能卡读卡器。几周后,我的一些客户将同时使用多个应用程序。因此,我认为创建一个控制身份验证过
我想设置一个小程序,从数据库中检索信息,然后根据请求将该信息分发给另一个程序。例如,一个名为“Master”的程序将从数据库中检索数据并创建一个对象集合(列表、数组等,无论哪种效果最好),然后一个名为
我有两台电脑,都装有 XE2。我以为我在两者上安装了相同的安装,但在其中一个上安装第 3 方软件包时遇到问题,而另一个则正常。 无论如何,我希望两者都一样。最简单的人可能只是通过移入我的 Dropbo
有冲突吗? 最佳答案 所有新版本的 Delphi 始终可以安全地安装到旧版本的下一个版本。 每个新版本都应安装在其自己的目录中。 如果您要安装多个版本,请始终先安装最旧的版本,然后再安装最新版本。 我
快速提问:如果我从代码中删除 // 或 (* *) 中的注释,Delphi 2007 的执行时间会受到影响吗?最终结果是一个可能包含数千行注释的 EXE 文件。 最佳答案 编译器会简单地忽略注释,并且
我必须对照另一个文件检查文件的每一行。 如果第二个文件中存在第一个文件中的一行,则必须删除它。 现在,我正在使用2个列表框,并且“对于listbox1.items.count-1可以开始...” 我的
我正在尝试在访问数据库中添加一些数据。但是我有麻烦,因为这会返回错误: ADOQuery1 missing sql property 实现了对代码的几次修改,到目前为止没有任何效果。 我究竟做错了什么
我用Delphi 5编写了一个程序,在Windows 8 32位PC上可以正常运行。我发现在Windows 7 64位笔记本电脑上运行它最终会导致reallocmem错误,而该错误在32位PC上不会发
看来这是我需要的工具,用于提取XML并与TClientDataset连接。我已经在几篇文章和文档中看到了它,但是我无法在XE2组件列表中找到它-在任何地方!应该在哪里?是否在可能未安装的可选软件包中?
我正在寻找一个非常通用的TDBTree组件,我想听听一些建议。我正在特别寻找一种显示主记录和“ n”个链接表记录的记录。 (我的意思是来自各个表的记录)。例如,TDBTree将钩接到主表,明细表1,附
我需要将按钮制作成旋转三角形的形状(或者说是任何多边形)。谁能提供任何建议? 最佳答案 查看Win32 API CreatePolygonRgn()和SetWindowRgn()函数,以创建一个HRG
你好专家 我的JvPasswordForm1有一个旧的JVC组件。 似乎该组件不再存在:它替换为哪个组件? 重新获得 最佳答案 尝试查找TJvLoginDialog,TjvPassword已合并到其中
几天前,我已经设置了我的开发环境(在装有Win 7的VM和域上的用户的VM上安装了delphi 2009),并安装了我的组件(jedi's,devExpress,ADS等)。 今天,我启动机器,打开d
开始对控件进行子分类的正确位置/时间是什么? 恢复原始窗口proc的正确时间是几点? 现在我在表单创建过程中子类化: procedure TForm1.FormCreate(Sender: TObje
有人可以给我一些有关如何登录访问的网页(使用任何网络浏览器)的指示吗?我应该建立一个全球代理....钩住网络....吗?我需要记录的只是页面地址,而不是其中包含的信息。 我正在使用Delphi。 谢谢
我创建了一个像 TMyClass = class(TObject) private FList1: TObjectList; FList2: TObjectList; public end;
我有一个BPG文件,我已对其进行修改以用作我们公司的自动构建服务器的make文件。为了使其正常工作,我必须进行更改 用途*用途 'unit1.pas'中的unit1 * unit1 'unit2.pa
我将Delphi 7代码迁移到了Delphi XE4。我在Delphi XE4的LoadFromStram方法中遇到错误,但对于Delphi 7来说也可以正常工作。 错误: First chance
我正在尝试学习一些新技巧,以便更好地组织我在 Delphi 中的单元中的一些源代码。 我注意到我访问的一些函数或方法似乎是类中的类,但是我还没有成功地在类中创建一个工作类,虽然它编译得很好,但在执行代
我有一个包含许多类的大单元,现在我想通过将某些类分成新的单元来重构该单元。 我不得不承认我缺乏使用Delphi内置IDE功能的经验。利用内置功能“查找|查找对类型的本地引用”并没有多大帮助,因为类方法
我是一名优秀的程序员,十分优秀!