在回答一个问题时,有一个讨论线程below my answer。这表明根据访问说明符(或可能是继承的类型),private/protected/public
,sizeof
,class
对象可能有所不同!
从他们的简短讨论中我仍然不明白,这怎么可能?
最佳答案
请注意下面的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
)对齐的系统上,不允许编译器重新排序c
到b
之前,强制在a
和b
之间插入额外的填充填充,并在c
之后插入对象的末尾(生成sizeof(Foo) == 12
) 。但是,为此:class Foo
{
char a;
public:
int b;
public:
char c;
};
a
和(b
和c
)由访问说明符分隔,因此编译器可以自由地执行这种重新排序,从而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;
};
,这会将
a
,b
和c
置于不同的访问控制中。请注意,在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/