一套内存布局

Hei*_*cht 7 delphi casting set delphi-2009

setDelphi中的内存是如何组织的?

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

var
  MyNumber : Word;
  ShiftState : TShiftState;
begin
  MyNumber:=42;
  ShiftState:=TShiftState(MyNumber);
end;
Run Code Online (Sandbox Code Playgroud)

德尔福(2009)不允许这样做,我不明白为什么.如果我得到一个数字,其中单个位编码不同的枚举值,那么这将使我的生活变得更容易,我可以像这样投射它.可以这样做吗?

我打算采用的一种方法是:

var
  ShiftState : TShiftState;
  MyNumber : Word absolute ShiftState;
begin
  MyNumber:=42;
end;
Run Code Online (Sandbox Code Playgroud)

但在此之前,我想我会要求内存布局.这是一种感觉,而不是知道我现在对此有何看法.

Cos*_*und 6

Delphi集是一个位字段,其位对应于集合中元素的关联值.对于一组常规枚举类型,位布局是直截了当的:

  • bit 0对应于序数值为0的set元素
  • 位1对应于序数值为1的set元素
  • 等等.

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

type enum=(seven=7, eight=8, eleven=11); 
EnumSet = set of enum;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Delphi将分配包含所有必需位的最小所需字节数,但不会"移位"位值以使用更少的空间.在EnumSet示例中,Delphi将使用两个字节:

  • 第一个字节将与第7个位相关联 seven
  • 第二个字节将与位0相关联 eight
  • 第二个字节将与第3位相关联 eleven

你可以看到我在这里做过的一些测试:Delphi 2009 - Bug?将所谓的无效值添加到集合中

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