当前位置:  开发笔记 > 小程序 > 正文

"现在打包强制字节对齐记录"是什么意思?

如何解决《"现在打包强制字节对齐记录"是什么意思?》经验,为你挑选了1个好方法。

Delphi XE2的新功能包含以下内容.

现在打包强制字节对齐记录

如果您的遗留代码使用打包记录类型,并且您想要与外部DLL或C++链接,则需要从代码中删除"packed"一词.packed关键字现在强制字节对齐,而在过去它不一定这样做.行为更改与Del​​phi 2009中的C++对齐兼容性更改有关.

我不明白这一点.我正在努力解决这一问题:而在过去,它并不一定会这样做.我无法调和的是,压缩总是导致记录的字节对齐,据我所知.任何人都可以给出一个非字节对齐的打包记录的例子吗?显然,这必须是早期版本.

为什么文档说"如果你想与外部DLL或C++链接,你需要删除代码中的单词"?如果外部代码使用了#pragma pack(1)那么如果打包是非限制我们该怎么办?

$ALIGN指令怎么样?是{$A1} and {$A-}相当于packed或者是有一些额外的意义与packed

我似乎错过了一些东西,如果有人能够解释这一点,我会很感激.或者文档真的很差?

更新

我有理由相信文档是指记录本身的对齐而不是记录的布局.这是一个小程序,它表明packed记录的使用强制记录的对齐为1.

program PackedRecords;
{$APPTYPE CONSOLE}
type
  TPackedRecord = packed record
    I: Int64;
  end;

  TPackedContainer = record
    B: Byte;
    R: TPackedRecord;
  end;

  TRecord = record
    I: Int64;
  end;

  TContainer = record
    B: Byte;
    R: TRecord;
  end;

var
  pc: TPackedContainer;
  c: TContainer;

begin
  Writeln(NativeInt(@pc.R)-NativeInt(@pc.B));//outputs 1
  Writeln(NativeInt(@c.R)-NativeInt(@c.B));//outputs 8
  Readln;
end.

这在Delphi 6,2010,XE和XE2 32位和XE 64位上产生相同的输出.



1> David Heffer..:

文档的最新更新删除了此问题所基于的所有文本.我的结论是原始文本只是一个文档错误.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有