美文网首页
vtordisp解释

vtordisp解释

作者: loki528 | 来源:发表于2019-11-22 21:20 被阅读0次

官方参考
https://docs.microsoft.com/en-us/cpp/preprocessor/vtordisp?view=vs-2019

The vtordisp pragma is applicable only to code that uses virtual bases. If a derived class overrides a virtual function that it inherits from a virtual base class, and if a constructor or destructor for the derived class calls that function using a pointer to the virtual base class, the compiler might introduce additional hidden vtordisp fields into classes with virtual bases.

The vtordisp pragma affects the layout of classes that follow it. The /vd0, /vd1, and /vd2 options specify the same behavior for complete modules. Specifying 0 or off suppresses the hidden vtordisp members. Turn off vtordisp only if there's no possibility that the class's constructors and destructors call virtual functions on the object pointed to by the this pointer.

Specifying 1 or on, the default, enables the hidden vtordisp members where they're necessary.

Specifying 2 enables the hidden vtordisp members for all virtual bases with virtual functions. #pragma vtordisp(2) might be necessary to ensure correct performance of dynamic_cast on a partially constructed object. For more information, see Compiler Warning (level 1) C4436.
#pragma vtordisp(), with no arguments, restores the vtordisp setting to its initial setting.

(我的翻译理解)
vtordisp pragma只有在使用虚基类的时候才有用。如果一个派生类重写了虚基类的虚函数,并且派生类的构造和析构函数使用指向虚基类的指针调用了这个函数,编译器可能会引入额外隐藏的vtordisp域到类中,连同虚基类(们)。

vtordisp pragma影响它之后的类的布局。/vd0, /vd1, /vd2选项为这个模块指定相同的行为。0或者off压制隐藏的vtordisp成员。只有当不存在this指向的对象的类的构造和析构函数调用虚函数的时候才关闭vtordisp。

指定1或者on,默认行为,在需要的时候添加vtordisp。

指定2,对于有虚函数的虚基类都添加vtordisp成员。为了保证在部分构造的对象上dynamic_cast的准确效率,#pragma vtordisp(2)可能是必须的。

没有参数的 #pragma vtordisp()恢复vtordisp的设置为初始设置。

我的理解是出现下面这样的情况,编译器可能会在派生类中添加成员vtordisp

class base {
public:
  virtual void test() {}
};
class derived: virtual public base {
public:
  int d;
  virtual void test() { d =0; }
  derived() { test(); }
};

实际测试,关闭vtordisp,同时在派生类的构造函数和析构函数中调用重写的虚基类成员函数的时候,编译没有报错,简单的运行通过了,目前没有进行更全面的测试。

相关文章

  • vtordisp解释

    官方参考https://docs.microsoft.com/en-us/cpp/preprocessor/vto...

  • 【为解释而解释解释】

    解釋多半是徒勞的因為許多東西根本不能解釋或者一經解釋便會失去原有的價值況且随着时日递迁解釋會變 解釋有時是不合理的...

  • 解释,不解释?

    默默:和我一起玩吧。开心点! 七昂:都清醒,都独立。 ...

  • 解释规则-解释问题

    board game 棋盘游戏dice game 掷骰子游戏tile game 智力拼图puzzle ...

  • 解释规则-解释原理

    零条件句 零条件句陈述普遍真理或客观事实,由两个分句组成,一个是 if 分句,一个是主句,中间以逗号隔开。两个句子...

  • 解释如何解释

    分别与分别有什么分别 再见和再见会不会再见 捂着胸口的疼痛 询问疼痛的心 梦境不可解释 春天不可解释 她走在来时的...

  • 解释与不解释

    年轻的时候,和家人或朋友闹了别扭,产生了误会,不愿结怨的那一方会尽力解释,真诚地表明自己以为的事实真相,那种想把自...

  • 解释

    《解释》 我曾带着憧憬 在一个远方 聆听你心碎的声音 还有什么言语 我听不见 是你解释不了的爱

  • 解释

  • 解释

    对于那些不懂你的人, 就不要再多做解释了。 因为不管你说得再好, 都会被当成借口。

网友评论

      本文标题:vtordisp解释

      本文链接:https://www.haomeiwen.com/subject/eixndctx.html