使用空类类型的对象的内存

Using the memory of an object of an empty class type

本文关键字:对象 内存 类型      更新时间:2023-10-16

由于在C++中,空类的sizeof是1个字节,因此以下代码有效吗?

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

我知道这很没用,但我只是想看看我能不能做到。它在MSVC2010上编译并运行良好。

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] = '';
std::cout << myStr;

(完整示例在这里)

在这里你应该考虑的是你";滥用;通过这种方式,也就是说,即使在对象被释放后,如果仍然保留指向该内存的指针,那么访问该内存将导致未定义的行为

请注意,仅仅因为语言允许你做某事,并不意味着你应该做。按照应该使用的方式使用这种语言的功能。毕竟,你写代码并不是为了";它起作用";。


对于你关于空课规模的问题,标准的同一部分也说:

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

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

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