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

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

内容简介: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


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

查看所有标签

猜你喜欢:

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

产品经理必懂的技术那点事儿:成为全栈产品经理

产品经理必懂的技术那点事儿:成为全栈产品经理

唐韧 / 电子工业出版社 / 2018-1 / 59

《产品经理必懂的技术那点事儿:成为全栈产品经理》以非技术背景产品经理学习技术为主题,将技术知识以简单并且易于理解的方式讲述出来,帮助非技术背景产品经理了解技术、学习技术,旨在帮助产品经理高效地与技术人员进行沟通与合作,避免不懂技术带来的困扰。 《产品经理必懂的技术那点事儿:成为全栈产品经理》主要内容围绕产品经理需要了解的互联网基础技术知识展开,涉及客户端、服务器端、数据库及一些数据处理知识。......一起来看看 《产品经理必懂的技术那点事儿:成为全栈产品经理》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具