作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
将派生类实例的指针强制转换为实例基类在 C++ 中是否有任何运行时开销,还是在编译时解决?
如果有的话,在转换操作中究竟需要计算什么?
例子:
class Foo;
class Bar : public Foo;
Bar* y = new Bar;
Foo* x = (Foo*) y;
(我知道我应该使用 C++ 风格的强制转换,而且答案可能与它们相同)
最佳答案
是的,虽然可以忽略不计。
在这种情况下,C 风格转换被解释为 static_cast
,这可能会导致指针调整。
struct Base {};
struct Derived: Base { virtual ~Derived(); } // note: introduced a virtual method
int main()
{
Derived derived;
Base* b = &derived;
Derived* d = (Derived*) b;
void* pb = b;
void* pd = d;
printf("%p %p", pb, pd);
return 0;
}
只要基础子对象未在派生对象的同一地址对齐,就会发生这种开销,这种情况发生在:
当然,指针调整通常被认为是可以忽略不计的,编译器应该足够聪明,在不需要的时候将其消除(调整为 0)。
注意:这取决于实现,不是标准强制要求的
关于c++ - 多态 C 风格的转换有任何开销吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5092689/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!