【问题标题】:Example where TYPE_ALIGNMENT() failsTYPE_ALIGNMENT() 失败的示例
【发布时间】:2011-02-02 00:52:18
【问题描述】:

我有一个关于 C/C++ 对齐的问题。在 Determining the alignment of C/C++ structures in relation to its membersMichael Burr 发布了这个宏:

#define TYPE_ALIGNMENT( t ) offsetof( struct { char x; t test; }, test )

在 cmets 中,有人写过这可能会因非 POD 类型而失败。有人可以给我一个失败的代码示例吗?

【问题讨论】:

    标签: c++ c memory-management alignment


    【解决方案1】:

    offsetof 仅指定用于 POD 类型。如果一个类包含任何不是 POD 的数据成员,则该类本身不是 POD。因此,如果您的示例中的 t 是非 POD 类型,则不能保证它可以正常工作。

    来自 C++ 标准 (18.1/5):

    offsetof 接受本国际标准中一组受限的 type 参数。 type 应为 POD 结构或 POD 联合。

    因此,如果您在非 POD 类型上使用 offsetof,则结果未定义。

    【讨论】:

    • 嗯,是的,但这不是我问的。例如类 foo{ int i;虚空栏(){}}; int main(){ std::cout
    • @JustMaximumPower:“工作正常”(或者,至少看起来工作正常)对于未定义的事情是一个合理的结果。 “可怕地崩溃”是另一个合理的结果。 任何事情都可能发生。它是否看起来有效或它会导致您的软件中的有害错误完全取决于实现。假设它适用于非 POD 类型是不明智的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2012-02-18
    • 2014-01-04
    • 2021-04-22
    • 2015-02-05
    • 1970-01-01
    相关资源
    最近更新 更多