gpt4 book ai didi

c++ - 当对象具有值语义时,在方法中内联虚函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:35 25 4
gpt4 key购买 nike

考虑以下带有模板方法设计模式的代码:

class A {
public:
void templateMethod() {
doSomething();
}
private:
virtual void doSomething() {
std::cout << “42\n”;
}
};
class B : public A {
private:
void doSomething() override {
std::cout << “43\n”;
}
};

int main() {
// case 1
A a; // value semantics
a.templateMethod(); // knows at compile time that A::doSomething() must be called

// case 2
B b; // value semantics
b.templateMethod(); // knows at compile time that B::doSomething() must be called

// case 3
A& a_or_b_ref = runtime_condition() ? a : b; // ref semantics
a_or_b_ref.templateMethod(); // does not know which doSomething() at compile time, a virtual call is needed
return 0;
}

我想知道编译器是否能够在情况 1 和情况 2 中内联/取消虚拟化“doSomething()”成员函数。如果它为 templateMethod() 创建 3 段不同的二进制代码,这是可能的:一段没有内联,2 段内联了 A::doSomething() 或 B::doSomething()(在情况 3 中必须分别调用, 1 和 2)

你知道这个优化是否是标准所要求的,或者是否有任何编译器实现了它?我知道我可以使用 CRT 模式实现同样的效果,但没有虚拟,但意图不太清楚。

最佳答案

该标准一般不需要优化(有时它会特意允许它们);它指定了结果,由编译器决定如何最好地实现它。

在所有这三种情况下,我都希望 templateMethod 是内联的。然后编译器可以自由地执行进一步的优化;在前两种情况下,它知道 this 的动态类型,因此可以生成对 doSomething 的非虚拟调用。 (然后我希望它内联这些调用。)

查看生成的代码并亲自了解。

关于c++ - 当对象具有值语义时,在方法中内联虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27539619/

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