任何类型的尺寸是否总能满足其要求?

问题描述

我在文档中没有找到清晰的陈述,但是我发现在实验中确实如此,

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

实际上,如果不正确,则在该类型的数组中的元素之间需要一些填充,因此,我相信它必须是正确的,但我只想确定一下。


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

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

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

i8 | 3bytes padding | i32 | i8

那尺寸是多少?在不同的情况和语言下, size 是一个有争议的概念吗?

解决方法

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

我不想谈您的身材问题;大小就是这么痛苦。 IMO对“……的大小”的答案因问题的原因而异,但这完全是IMO。

,

这是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定义为可能不会被存储覆盖的字节。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...