由于在C ++中sizeof
的空类是1字节,以下代码是否有效?
class A
{
};
int main()
{
A a;
char* p = reinterpret_cast<char*>(&a);
*p = 'a';
}
我知道它几乎没用,但只是想知道我是否能做到这一点。它在MSVC2010上编译并运行良好。
答案 0 :(得分:1)
C ++ 03 standard 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;
(完整示例为here)
这里你应该考虑的是你以这种方式“滥用”的对象的生命周期,即如果你仍然保留指向这个内存的指针,即使在对象被释放后,访问这个内存将导致未定义行为强>
请注意,仅仅因为语言允许你做某事,这并不意味着你应该这样做。使用这种语言的功能,就像它们的使用方式一样。毕竟,你不是在编写代码,只是为了“它有效”。
关于空类大小的问题,标准的同一部分也说:
§4:如果完整对象,数据成员(9.2)或数组元素属于类类型,则其类型被视为派生类最多,将它与任何基类子对象的类类型区分开来;最派生类类型的对象称为最多派生对象。
§5:除非它是位字段(9.6),否则大多数派生对象应具有非零大小并且应占用一个或多个存储字节。基类子对象可以具有零大小。 POD类型(3.9)的对象应占用连续的存储字节。
因此,标准保证像你这样的空类的对象将占用至少1个字节。