我在文档中没有找到一个明确的声明,但我发现在我的实验中,是正确的
bits_of(A) % alignment(A) == 0
事实上,如果它不是真的,那么在该类型的数组中的元素之间需要一些填充,所以我相信它一定是真的,但我只想在这里确定一下。
我在想另一个问题,一个类型的大小是多少?
实际上,LLVM IR并没有提供任何标准指令来获取类型的大小,只是通过一些技巧,如(int)(((T*) NULL) + 1)
,如这里和那里所描述的。
然而,这只是对齐的相邻指针的差异,它总是对齐的倍数。它可能不是实际占用的大小。例如,结构{i8, i32, i8}
在相邻对齐的指针中有12个字节,但在考虑字段对齐时只占用9个字节(9个字节足够用于内存分配(
i8 | 3bytes padding | i32 | i8
那么这个尺寸是多少?size在不同的情况和语言中是一个有争议的概念吗?
我不想谈你的尺码问题;尺码太让人头疼了。IMO对";有多大…";问题的原因各不相同,但这在很大程度上是IMO.
这是StoreSize
和AllocSize
的区别,
这里是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
——存储>可以覆盖的最大字节数——可能不是。