【问题标题】:Will sizeof always be a multiple of alignof?sizeof 是否总是 alignof 的倍数?
【发布时间】:2019-01-27 02:13:52
【问题描述】:

sizeof(Type) 总是能被alignof(Type) 整除

这样这个陈述将永远是真的吗? sizeof(Type) % alignof(Type) == 0

【问题讨论】:

  • 题外话,但你能举一个重要的例子吗?
  • @L.F. - 将Type 的数组放入你已经拥有的内存中,如果这是错误的,sizeof 不能用作对象之间的步幅,因为后面的对象将不正确地对齐
  • 这很好。 =.=
  • 是的,这源于数组类型Type[N] 的属性(即它们的大小和缺少内部填充)。
  • @Anne 我不确定,但我认为是。例如看this,它以sizeof(Tracer)的步幅手动构造对象。

标签: c++ sizeof memory-alignment


【解决方案1】:

是的,sizeof(Type) % alignof(Type) == 0 适用于所有类类型。

标准草案说:

[dcl.array] ... 数组类型的对象包含一个连续分配的非空集合,由 N 个 T 类型的子对象组成。

[expr.sizeof] ...当应用于一个类时,结果是该类的对象中的字节数,包括将该类型的对象放入数组中所需的任何填充。

为了对齐数组的每个元素,两个相邻元素之间的距离必须是对齐的倍数。 sizeof 被定义为这个距离。

有趣的是,对于窄字符类型以外的基本类型,sizeof 只是实现定义:

[expr.sizeof] ... sizeof 的结果应用于任何其他基本类型 (6.7.1) 是实现定义的。

也就是说,我从未见过一个系统,其中基本类型的大小不是其对齐的倍数。毕竟它们也必须在一个数组中对齐。

【讨论】:

    猜你喜欢
    • 2016-12-12
    • 2018-03-09
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 2010-09-28
    相关资源
    最近更新 更多