Den*_*kov 7 delphi 64-bit enums 32-bit 32bit-64bit
我发现一个SizeOf(set)在32位和64位上有所不同,下面的例子显示32位为5字节,64位为8位.但我没有找到有关64位SizeOf(集)变化的信息.是否有关于它的Embarcadero文档或编译器指令在32位和64位上获得类似的结果.
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses System.SysUtils;
type
{ Enumeration of properties}
TProperty1 = (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14,
p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28,
p29, p30, p31, p32, p33, p34, p35, p36, p37);
TProperties1 = set of TProperty1;
begin
WriteLn(SizeOf(TProperties1));
ReadLn;
end.
Run Code Online (Sandbox Code Playgroud)
回答你的问题.我在Embarcadero网站上找不到任何关于差异的内容或改变行为的编译器指令.我的研究表明如下:
集合在32位中具有以下字节大小:
从这一点开始,它会根据需要添加字节,一次添加一个字节.因此33到40个元素使用5个字节,41到48个元素使用6个字节.
在64位模式下,情况略有不同:
从这一点开始,它会根据需要添加字节,一次添加一个字节.因此,65到72个元素使用9个字节,73到80个元素使用10个字节.
要解决这个问题,你需要使用像WriteSetin 这样的东西TWriter.WriteProperty,TReader.ReadSet或者你可以做这样的事情:
procedure SaveSetToStream(aStream: TStream; const aSet: TProperties1);
var
streamData: array[0..7] of byte;
begin
Assert(SizeOf(aSet) <= SizeOf(streamData), 'Set is too large to save. Increase the array length.');
FillChar(streamData, SizeOf(streamData), 0);
Move(aSet, streamData, SizeOf(aSet));
aStream.Write(streamData, SizeOf(streamData));
end;
function ReadFromStream(aStream: TStream): TProperties1;
var
streamData: array[0..7] of byte;
begin
Assert(SizeOf(Result) <= SizeOf(streamData), 'Set is too large to load. Increase the array length.');
aStream.Read(streamData, SizeOf(streamData));
Move(streamData, Result, SizeOf(Result));
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
792 次 |
| 最近记录: |