gpt4 book ai didi

delphi - 集合的内存布局

转载 作者:行者123 更新时间:2023-12-03 14:52:49 25 4
gpt4 key购买 nike

在 Delphi 中,集合在内存中是如何组织的?

我尝试做的是将简单类型转换为集合类型,例如

var
MyNumber : Word;
ShiftState : TShiftState;
begin
MyNumber:=42;
ShiftState:=TShiftState(MyNumber);
end;

Delphi (2009) 不允许这样做,我不明白为什么。如果我得到一个数字,其中单个位编码不同的枚举值,并且我可以像这样转换它,这将使我的生活变得更加轻松。这可以吗?

我要采用的一种方法是:

var
ShiftState : TShiftState;
MyNumber : Word absolute ShiftState;
begin
MyNumber:=42;
end;

但在这样做之前,我想我应该询问内存布局。这更多的是一种感觉,而不是我现在对此的了解。

最佳答案

Delphi 集是一个位字段,其位对应于集合中元素的关联值。对于一组普通枚举类型,位布局很简单:

  • 位 0 对应序数为 0 的集合元素
  • 位 1 对应序数为 1 的集合元素
  • 等等。

当您处理不连续的集合或不从 0 开始的集合时,事情会变得有点有趣。您可以使用 Delphi 的子范围类型来做到这一点(例如:set of 3.. 7) 或使用指定元素实际序数值的枚举类型:

type enum=(seven=7, eight=8, eleven=11); 
EnumSet = set of enum;

在这种情况下,Delphi 将分配所需的最小字节量,其中包括所有所需的位,但不会“移动”位值以使用更少的空间。在 EnumSet 示例中,Delphi 将使用两个字节:

  • 第一个字节的第 7 位与 7 相关联
  • 第二个字节将具有与关联的位0
  • 第二个字节将具有与11关联的位3

您可以在这里看到我所做的一些测试:Delphi 2009 - Bug? Adding supposedly invalid values to a set

测试是使用Delphi 2010完成的,没有对Delphi XE重复测试。

关于delphi - 集合的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6252141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com