代码之家  ›  专栏  ›  技术社区  ›  Daniel Langr

对象地址是否保证是其类型对齐的多个实例?

  •  4
  • Daniel Langr  · 技术社区  · 6 年前

    对齐 已定义 in the Standard 如下:

    对齐是一个实现定义的整数值,表示 连续地址之间可分配给定对象的字节数。 .

    但是,这并不意味着这些地址是对齐值的倍数。例如,两个 double 地址处的对象 0x01 0x09 满足上述定义。

    是否以某种方式保证对象的地址是其类型的对齐值的倍数?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Bathsheba    6 年前

    不,不是。

    只有一个 线性关系 , 可以保证比例,但即使这样,在结构包装中也可以放宽对齐要求。

    /*packed*/ struct s {double a; char b; double c;);
    

    注意 nullptr 甚至不必是零内存字节、虚拟内存或其他。

        2
  •  0
  •   supercat    6 年前

    对于非结构或联合成员的对象,标准没有定义任何可以观察对齐的方法,除非操作因未对齐而失败。如果平台可以静默地处理具有任意对齐方式的对象(尽管可能不如正确对齐的对象快),并且如果该平台的实现没有定义 uintptr_t intptr_t 这样就没有可观察的方法可以检测到未能对齐独立对象,因此不需要实际对齐对象。

    大多数实现都会记录检测指针对齐的方法,并且应该处理对齐指令,使它们的行为方式与文档一致。一个人可以有一个一致的实现,而不是这样做,就像一个人可以有一致的但低质量的实现做各种奇怪的愚蠢的事情一样,但是质量实现应该避免这种胡说八道。