在回答一个问题时,有一个讨论线程below my answer。这表明根据访问说明符(或可能是继承的类型),private/protected/publicsizeofclass对象可能有所不同!

从他们的简短讨论中我仍然不明白,这怎么可能?

最佳答案

请注意下面的C++ 11新语言

在C++ 03 中,有一种语言使之成为可能,即9.2 [class.mem]/12(强调我的语言):



所以给定这个定义:

class Foo
{
    char a; //8 bits
    // a must come before b, so 3 bytes of padding have to go here to satisfy alignment
    int b; //32 bits
    char c; //8 bits
    // 24 bits of padding required to make Foo a multiple of sizeof(int)
};

在32位(int)对齐的系统上,不允许编译器重新排序cb之前,强制在ab之间插入额外的填充填充,并在c之后插入对象的末尾(生成sizeof(Foo) == 12) 。但是,为此:
class Foo
{
    char a;
public:
    int b;
public:
    char c;
};
a和(bc)由访问说明符分隔,因此编译器可以自由地执行这种重新排序,从而
memory-layout Foo
{
    char a; // 8 bits
    char c; // 8 bits
    // 16 bits of padding
    int b; // 32 bits
};
sizeof(Foo) == 8

在C++ 11 中,语言略有变化。 N3485 9.2 [class.mem]/13说(强调我的):



这意味着在C++ 11中,在上面的示例中(由3个公众分隔),仍然不允许编译器执行重新排序。它一定是这样的
class Foo
{
    char a;
public:
    int b;
protected:
    char c;
};

,这会将abc置于不同的访问控制中。

请注意,在C++ 11规则下,给出的定义如下:
class Foo
{
    char a;
public:
    int b;
protected:
    char c;
public:
    int d;
};

编译器必须将d放在b之后,即使它们被访问说明符隔开。

(也就是说,我不知道任何实现实际上利用了任一标准提供的纬度的实现)

关于c++ - 对象的大小会受到访问说明符类型和继承类型的影响吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6577906/

10-17 02:24