gpt4 book ai didi

c++ - 这种指针调整是否发生在非多态继承中?

转载 作者:搜寻专家 更新时间:2023-10-31 00:33:32 25 4
gpt4 key购买 nike

非多态继承需要这个指针调整吗?在我见过的所有情况下,这个指针调整都讨论了使用的示例涉及通过关键字 virtual 的多态继承。

我不清楚非多态继承是否需要此指针调整。

一个极其简单的例子是:

struct Base1 {
void b1() {}
};

struct Base2 {
void b2() {}
};

struct Derived : public Base1, Base2 {
void derived() {}
};

下面的函数调用是否需要调整这个指针?

Derived d;
d.b2();

在这种情况下,this 指针调整显然是多余的,因为没有访问任何数据成员。另一方面,如果继承的函数访问数据成员,那么这种指针调整可能是个好主意。另一方面,如果成员函数没有被内联,那么这个指针调整似乎无论如何都是必要的。

我意识到这是一个实现细节,而不是 C++ 标准的一部分,但这是一个关于真实编译器行为方式的问题。我不知道这是不是像 vtables 这样所有编译器都遵循相同的通用策略的情况,或者我是否问了一个非常依赖于编译器的问题。如果它非常依赖于编译器,那么这本身就是一个足够的答案,或者如果您愿意,您可以专注于 gcc 或 clang。

最佳答案

对象的布局不是由语言指定的。来自 C++ 草案标准 N3337:

10 Derived Classes

5 The order in which the base class subobjects are allocated in the most derived object (1.8) is unspecified. [ Note: a derived class and its base class subobjects can be represented by a directed acyclic graph (DAG) where an arrow means “directly derived from.” A DAG of subobjects is often referred to as a “subobject lattice.”

enter image description here

6 The arrows need not have a physical representation in memory. —end note ]

回答您的问题:

Would the following function call require this pointer adjustment?

这取决于编译器如何创建对象布局。它可能会也可能不会。

在你的例子中,由于类中没有成员数据,没有虚成员函数,而且你使用的是第一个基类的成员函数,你可能看不到任何指针调整。但是,如果您添加成员数据,并使用第二个基类的成员函数,您很可能会看到指针调整。

下面是一些示例代码和运行代码的输出:

#include <iostream>

struct Base1 {
void b1()
{
std::cout << (void*)this << std::endl;
}
int x;
};

struct Base2 {
void b2()
{
std::cout << (void*)this << std::endl;
}
int y;
};

struct Derived : public Base1, public Base2 {
void derived() {}
};

int main()
{
Derived d;
d.b1();
d.b2();
return 0;
}

输出:

0x28ac280x28ac2c

关于c++ - 这种指针调整是否发生在非多态继承中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28372365/

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