作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑以下带有模板方法设计模式的代码:
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/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!