gpt4 book ai didi

c++ - 使用空类类型对象的内存

转载 作者:太空狗 更新时间:2023-10-29 23:06:43 26 4
gpt4 key购买 nike

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

class A
{
};

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

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

最佳答案

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

Relevant parts of §1: An object is a region of storage... Some objects are polymorphic... For other objects, the interpretation of the values found therein is determined by the type of the expressions used to access them."

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

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

(完整示例为 here )

你在这里应该考虑的是你以这种方式“滥用”的对象的生命周期,即即使在对象被释放后你仍然保留指向这个内存的指针,访问这个内存将导致 undefined行为

请注意,仅仅因为该语言允许您做某事,并不意味着您应该去做。按照应有的方式使用这种语言的特性。毕竟,您编写代码并不是为了“有效”。


对于你关于空类大小的问题,标准的同一部分还说:

§4: If a complete object, a data member (9.2), or an array element is of class type, its type is considered the most derived class, to distinguish it from the class type of any base class subobject; an object of a most derived class type is called a most derived object.

§5: Unless it is a bit-field (9.6), a most derived object shall have a non-zero size and shall occupy one or more bytes of storage. Base class sub-objects may have zero size. An object of POD type (3.9) shall occupy contiguous bytes of storage.

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

关于c++ - 使用空类类型对象的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14811171/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com