数组 – 在Delphi中array和packed数组之间有什么不同吗?

栏目: 编程语言 · 发布时间: 7年前

内容简介:http://stackoverflow.com/questions/4583985/are-there-any-difference-between-array-and-packed-array-in-delphi

在C/C++你总是有

SizeOf(array[N] of T) = N * SizeOf(T);

在Pascal / Delphi中,您可以使用“打包数组”来确保上述assert是真实的,但是“包装”说明符对于Delphi中的数组有什么实际价值?我无法创建“unpacked”数组的示例,数组似乎总是“打包”:

type
  A = array[0..2] of Byte;
  B = array[0..99] of A;
  C = packed record
    C1, C2, C3: Byte;
  end;
  D = array[0..99] of C;

procedure TForm10.Button1Click(Sender: TObject);
begin
  Assert(SizeOf(A) = 3);
  Assert(SizeOf(B) = 300);
  Assert(SizeOf(D) = 300);
end;

(C/C++结构和Delphi记录是不同的 – 它们可以“解包”,因此,由于字段的对齐,结构的大小大于字段大小的总和).

在Delphi中没有实际的效果.可以合理影响的唯一类型是具有最奇怪的对齐和大小组合的类型,扩展,其大小为10,对齐为8.然而,扩展的阵列基本上已经被打包(尽管它们仍然具有8的对齐方式;如果打包指令像记录一样工作,它们将具有1).

为什么我说扩展数组是唯一可以影响的类型?没有其他Delphi类型,内置的或者可以组合的,它的大小不是整数倍的整数(留下旧版本的Delphi,还有一些bug).对齐是使填充记录更大的事情;它会使字段间隔开,以便每个字段以其类型对齐的整数倍的偏移开始.在类似于数组的情况下,仅涉及一种类型,如果大小已经是类型对齐的倍数,则不需要填充.

这是一个程序,显示扩展如何影响大小和对齐方式,取决于它是否包含在记录中;你可以添加包装到数组,看到它没有什么区别:

type
  TWrap = record
    X: Extended;
  end; // field size=10, align=8, => actual size=16

  TArr1 = array[1..3] of TWrap; // 3*16 => size=48, align=8
  TArr2 = array[1..3] of Extended; // 3 * 10 => size=30, align=8

  TRec1 = record
    A: Byte;
    B: TArr1;
  end;

  TRec2 = record
    A: Byte;
    B: TArr2;
  end;

var
  x: TRec1;
  y: TRec2;
begin
  Writeln('Size of TArr1: ', SizeOf(TArr1));
  Writeln('Alignment of TArr1: ', Integer(@x.B) - Integer(@x.A));
  Writeln('Size of TArr2: ', SizeOf(TArr2));
  Writeln('Alignment of TArr2: ', Integer(@y.B) - Integer(@y.A));
end.

更多关于对齐和打包的单词:打包有另一个效果(在记录上),而不仅仅是保证没有添加填充:它也将记录标记为自己的对齐方式1.这具有导致其频繁的负面影响在其他地方使用时对齐.为了语言/操作系统的互操作性,只有在其他语言不使用OS对齐规则的情况下(通常意味着C对齐规则),才能使用打包指令. (某些Windows API标头对于在其中定义的类型有不正确的对齐方式,请记住,自此以后就必须使用它).另一方面,为了与文件格式兼容,打包可能是合理的,但是有关于类型选择(例如,整数在16位Delphi中为2字节,随后为4个字节),还有许多其他问题.

Delphi尝试使用C兼容规则进行对齐.在过去,它有一些错误(特别是记录如TRec =记录A,B:扩展结束;与TRec =记录A:扩展; B:扩展结束),但这些错误应该现在修复

http://stackoverflow.com/questions/4583985/are-there-any-difference-between-array-and-packed-array-in-delphi


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据分析技术白皮书

数据分析技术白皮书

伍海凤、刘鹏、杨佳静、马师慧Sara、李博、Shirley Song、Zinc、李晓艳 / 2016-8-11 / 0

关于数据分析技术白皮书(Analytics Book 中文版),主要内容围绕: 1. 分析(Analytics):网站分析 & APP分析 2. 谷歌分析工具的原理、部署与使用 3. 开源网站分析工具的原理、部署与使用 4. Log日志分析原理 5. 网站分析的维度与指标定义 6. 如何炼成为一个互联网数据分析师 请访问书的数据分析技术白皮书官网“免费”阅......一起来看看 《数据分析技术白皮书》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具