如何解决任何类型的尺寸是否总能满足其要求?
我在文档中没有找到清晰的陈述,但是我发现在实验中确实如此,
bits_of(A) % alignment(A) == 0
实际上,如果不正确,则在该类型的数组中的元素之间需要一些填充,因此,我相信它必须是正确的,但我只想确定一下。
我在想另一个问题,类型的大小是多少?
实际上,LLVM IR不提供任何标准指令来获取类型的大小,而只是通过诸如here和there所述的技巧来(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。
,此处是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
定义为可能不会被存储覆盖的字节。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。