gpt4 book ai didi

c++ - 非虚推导: what do I really get from the compiler?

转载 作者:太空宇宙 更新时间:2023-11-04 12:23:17 25 4
gpt4 key购买 nike

我想知道在使用非虚推导时编译器会生成什么:

template< unsigned int D >
class Point
{
int[D];
// No virtual function
// ...
};
class Point2 : public Point<2> {};
class Point3 : public Point<3> {};

这里的推导是否只意味着编译时检查?还是有其他开销?

我注意到我的编译器在使用 Point2 时生成相同大小的对象或直接Point<2> .我推断推导不会产生 vtable,因此,永远不会进行任何虚拟调用。

我错过了什么吗?


上下文

我想为给定的类模板提供几个预定义的特化。我从 typedef 开始:

template< unsigned int D >
class Point
{
int[D];
};
typedef Point<2> Point2;
typedef Point<3> Point3;

唉,这会阻止客户端使用“简单的”前向声明:

// No #include <Point.h>
class Point2; // 'Point2': redefinition; different basic types
class Point3; // 'Point3': redefinition; different basic types

然后必须编写这段相当不直观的代码:

// No #include <Point.h>
template< unsigned int > class Point;
typedef Point<2> Point2;
typedef Point<3> Point3;

这就是我放弃 typedef 并使用非虚拟派生的原因。不过,我想知道所有的含义是什么。

(另一种策略是在专用头文件中编写一次前向声明,à la #include <iosfwd>。)

最佳答案

好吧,看起来到目前为止还没有人给你一个真正的问题答案:

不,非虚拟推导没有开销。编译器不必创建虚表,也没有虚函数调用,一切都很好。它通常通过将基类的实例放在派生类的开头来简单地实现,这样指向派生类的指针也可以被视为指向基类的指针。然后一切都正常工作

当然,必须转发构造函数调用,但它们通常会被内联,从而也消除了这种开销。

但是,如果您使用多个基类,它可能会引入一点点开销(取决于编译器如何实现它)。可能不多(this 指针必须不时调整),但理论上它是存在的。

关于c++ - 非虚推导: what do I really get from the compiler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3762036/

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