【问题标题】:C++ Class members as array, packing failure caseC++类成员作为数组,打包失败案例
【发布时间】:2012-10-22 19:56:35
【问题描述】:

我想知道是否存在使用指针迭代相同类型的成员变量会失败的具体情况?我知道成员打包/填充是实现定义的,但在我尝试过的实现(gcc、clang 和 Visual Studio)中,我不能让它失败。

即使是可能失败的情况,例如以下,也都成功了:

#pragma pack(16)

struct MyStruct 
{
    char firstChar;
    char mySecondChar;
    char thirdChar;
};

class MyContainerStruct
{
public:
    uint64_t big;
    MyStruct z1;
    MyStruct z2;
} gStruct;

main()
{
    MyStruct *pStruct = &(gStruct.z1); // Start with gStruct.z1
    pStruct++;                        // Iterate to gStruct.z2
    cout << pStruct->myThirdChar;
}

谁能找到迭代相同类型的类成员失败的情况?

【问题讨论】:

    标签: c++ gcc memory-alignment


    【解决方案1】:

    如果字段的可见性不同,编译器可能会对其重新排序。它还可以出于任意原因使用它喜欢的任意空间填充字段(但是,许多编译器具有可用于控制此行为的扩展)。

    一个可见性说明符中的字段保证按照它们在定义中出现的顺序。可见性部分不一定按任何顺序排列,即使它们与另一个部分具有相同的可见性。

    class A
    {
    public:
        int someField;      // will always be in the same order WRT someOtherField
        int someOtherField;
    private:
        int anotherField;   // may be before or after someField
        int moreFields;
    };
    

    【讨论】:

    • 我认为关于herp 的评论不正确。 9.2/14 规定具有相同访问控制的成员按顺序分配; herpanotherField 具有相同的访问控制(私有),因此 herp 必须位于更高的地址。
    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2019-06-05
    • 2010-09-30
    相关资源
    最近更新 更多