【问题标题】:Would size of any type always be multple of its aligment?任何类型的大小都会是其对齐方式的倍数吗?
【发布时间】:2020-11-02 14:38:45
【问题描述】:

我没有在文档中找到明确的声明,但我发现在我的实验中确实如此,

bits_of(A) % alignment(A) == 0

事实上,如果不是真的,那么该类型数组中的元素之间需要一些填充,所以我相信它一定是真的,但我只是想在这里确定一下。


我在想另一个问题,类型的大小是多少?

实际上,LLVM IR 不提供任何标准指令来获取类型的大小,而只是通过 (int)(((T*) NULL) + 1) 之类的技巧,如 herethere 所述。

但是,它只是对齐的相邻指针的差异,它始终是其对齐的倍数。 它可能不是实际占用的大小。 例如结构体{i8, i32, i8},在相邻对齐的指针中有12个字节,但考虑到字段对齐只占用9个字节(9个字节足够内存分配)

i8 | 3bytes padding | i32 | i8

那么尺寸是多少呢? 大小在不同的情况和语言中是一个有争议的概念吗?

【问题讨论】:

  • 我也对 LLVM 之外的其他情况感兴趣。

标签: alignment size llvm sizeof memory-alignment


【解决方案1】:

LLVM 允许您使用 data layout 在模块中配置对齐方式。大多数数据布局将如您所见,但这不是 LLVM 所要求的。您可以创建一个模块,其中 int 类型具有 256 位对齐和 32 位大小,或 32 位对齐和 256 位大小,并且在某些情况下这两者都有意义(考虑具有 256 的 32 位可寻址系统-bit L1 缓存线)。

我不想回答你的尺码问题;大小是这样的痛苦。 IMO 对“……的大小是多少”的回答因问题的原因而异,但这与 IMO 非常相似。

【讨论】:

    【解决方案2】:

    这是StoreSizeAllocSize的区别,

    这里的例子来自LLVM source

    /// Size examples:
       ///
       /// Type        SizeInBits  StoreSizeInBits  AllocSizeInBits[*]
       /// ----        ----------  ---------------  ---------------
       ///  i1            1           8                8
       ///  i8            8           8                8
       ///  i19          19          24               32
       ///  i32          32          32               32
       ///  i100        100         104              128
       ///  i128        128         128              128
       ///  Float        32          32               32
       ///  Double       64          64               64
       ///  X86_FP80     80          80               96
       ///
       /// [*] The alloc size depends on the alignment, and thus on the target.
       ///     These values are for x86-32 linux.
    

    AllocSize 定义为连续对象之间的字节偏移量当然总是对齐的倍数,但StoreSize 定义为可能的最大字节数被存储覆盖,可能不会。

    【讨论】:

      猜你喜欢
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 2021-07-11
      • 1970-01-01
      • 2016-03-01
      相关资源
      最近更新 更多