任何类型的尺寸都会是对齐的倍数吗



我在文档中没有找到一个明确的声明,但我发现在我的实验中,是正确的

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

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


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

实际上,LLVM IR并没有提供任何标准指令来获取类型的大小,只是通过一些技巧,如(int)(((T*) NULL) + 1),如这里和那里所描述的。

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

i8 | 3bytes padding | i32 | i8

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

LLVM允许您使用数据布局在模块中配置对齐。大多数数据布局将如您所见,但LLVM并不需要这样做。您可以制作一个int类型具有256位对齐和32位大小,或32位对齐和256位大小的模块,在某些情况下,这两者都有意义(考虑具有256位L1缓存线的32位可寻址系统(。

我不想谈你的尺码问题;尺码太让人头疼了。IMO对";有多大…";问题的原因各不相同,但这在很大程度上是IMO.

这是StoreSizeAllocSize的区别,

这里是LLVM源的示例

/// 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——连续对象之间的字节偏移量当然总是对齐的倍数,但定义为<em的StoreSize——存储>可以覆盖的最大字节数——可能不是。

最新更新