【问题标题】:Is the exact layout of D structs defined?是否定义了 D 结构的确切布局?
【发布时间】:2016-08-19 04:20:29
【问题描述】:

是否定义了 D 结构的确切布局?也就是说,以独立于编译器的方式定义的每个成员的确切偏移量?这意味着编译器将被禁止重新排序字段,以实现较小项目的最佳打包并最小化所有偏移量,这取决于您的需要。

【问题讨论】:

    标签: layout struct d portability interfacing


    【解决方案1】:

    D 编译器重新排列结构的成员确实是非法的(尽管它可以 用于类)。重要的是编译器不要为结构重新排列成员,因为结构应该能够用于需要特定内存布局的低级内容。这也是结构需要能够与 C 代码交互的情况,因此它们需要与您在 C 中获得的内容相匹配(至少在使用 extern(C) 时)。因此,结构绝对不会重新排列其成员。此外,您可以通过align attribute 指定成员的对齐方式,因此您可以完全控制结构的布局。

    现在,默认布局可能因架构而异(例如,64 位指针比 32 位指针占用更多空间,这将影响结构成员的打包方式),但它应该与您在 C 中获得的内容相匹配在那个架构上。

    【讨论】:

    • 这是否暗示 D 编译器用于任何不正确对齐的数据(例如字的奇数地址)是非法的(例如 M68000、PDP-11?)必须生成多个单字节提取或商店?
    • @CecilWard AFAIK,目前没有 D 编译器支持这样的架构,虽然官方规范有很多很好的信息,但参考编译器所做的实际上是规范(和dmd 仅适用于 x86/x86_64)。所以,除非这个问题出现在 gdc 或 ldc,否则它可能甚至都没有被讨论过。我希望答案是 D 编译器会做相应的 C 编译器所做的任何事情,但我不知道。
    • 实际上,我意识到您对与 C 的兼容性要求是绝对正确的,当然您之前提到过。所以实际上我的问题实际上是一个 C 问题,我不知道 C 做了什么,各种 C 或 C++ 标准是否对此事有什么要说的。我多年前使用的 68000 的 C 编译器 iirc 可能会拒绝生成不对齐的单词,或者会让可执行文件简单地崩溃,但不足以生成多字节获取/存储。
    猜你喜欢
    • 2012-04-04
    • 2017-09-24
    • 1970-01-01
    • 2018-01-12
    • 2013-11-30
    • 1970-01-01
    • 2016-11-12
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多