gpt4 book ai didi

c++ - C++对象类的第一个成员

转载 作者:行者123 更新时间:2023-11-30 01:17:02 25 4
gpt4 key购买 nike

我知道下面的内容不好,但我的印象是类(class)的第一个成员是类(class)的起始地址。错了吗?

   class A{
public:
int a;
int b;
};

class B{
public :
int x;
};

int main()
{
B *pb=new B();
A *pa=(A*)pb;
pa->a++;
}

我的印象是 pb->x 会增加 1。它总是 true 还是 undefined ?为什么当我们有用户定义的构造函数或虚函数时它会改变?

最佳答案

只有当你的类是 standard_layout 类型时,这才成立。您可以使用类型特征 is_standard_layout 进行测试

 std::cout << std::is_standard_layout<A>::value << '\n';
std::cout << std::is_standard_layout<B>::value << '\n';

对于其他类,内存中存储了额外的信息,这些信息是特定于编译器且未标准化的。你可以看看This question其中讨论和展示了一些内存布局。

对于您的第二个示例/问题,标准引用了以下内容(5.2.10/7,N3337 草案):

An object pointer can be explicitly converted to an object pointer of a different type. When a prvalue v of type “pointer to T1” is converted to the type “pointer to cv T2”,the result is static_cast<cv T2*>(static_cast<cv void*>(v)) if both T1 and T2 are standard-layout types (3.9) and the alignment requirements of T2 are no stricter than those of T1,or if either type is void. Converting a prvalue of type “pointer to T1” to the type “pointer to T2” (where T1 and T2 are object types and where the alignment requirements of T2 areno stricter than those of T1) and back to its original type yields the original pointer value. The result of any other such pointer conversion is unspecified.

如果我正确阅读和解释了这一点,那么您的示例未指定,因为 A 的对齐要求比 B 的对齐要求更大。但是,另一种方式应该没问题,例如:

int main()
{
A *pa=new A();
B *pb=reinterpret_cast<B*>(pa);
pb->x++;
std::cout << pa->a;
}

关于c++ - C++对象类的第一个成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25377877/

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