3

由于在 C++sizeof中一个空类是 1 个字节,下面的代码是否有效?

class A
{
};

int main()
{
    A a;
    char* p = reinterpret_cast<char*>(&a);
    *p = 'a';
}

我知道它几乎没用,但只是想看看我是否可以做到这一点。它在 MSVC2010 上编译并运行良好。

4

1 回答 1

1

C++03 标准 1.8 C++ 对象模型:

§1的相关部分:一个对象是一个存储区域......有些对象是多态的......对于其他对象,其中找到的值的解释取决于用于访问它们的表达式的类型。"

在您的示例中,a是一个具有自动存储持续时间的对象,该对象在执行离开范围时被释放。基本上,你可以使用它所在的内存,你可以在那里存储任何你想要的东西:

int i;
char* myStr = reinterpret_cast<char*>(&i);
myStr[0] = 'H';
myStr[1] = 'i';
myStr[2] = '!';
myStr[3] = '\0';
std::cout << myStr;

(完整的例子在这里

您在这里应该考虑的是您以这种方式“滥用”的对象的生命周期,即如果即使在对象已被释放后仍保留指向该内存的指针,则访问该内存将导致未定义的行为

请注意,仅仅因为语言允许您做某事,并不意味着您应该这样做。以应有的方式使用该语言的功能。毕竟,您编写代码并不是为了“它有效”。


对于您关于空班规模的问题,标准的同一部分还说:

§4 : 如果一个完整的对象、一个数据成员 (9.2) 或一个数组元素是类类型,则其类型被认为是最派生类,以区别于任何基类子对象的类类型;最派生类类型的对象称为最派生对象

§5:除非它是位域 (9.6),否则最派生的对象应具有非零大小,并应占用一个或多个字节的存储空间。基类子对象的大小可能为零。POD 类型 (3.9) 的对象应占用连续的存储字节。

因此,标准保证像您这样的空类的对象将占用至少 1 个字节

于 2013-02-11T12:26:07.493 回答