开销执行成员函数的实现

问题描述 投票:3回答:1

我有一个Base类和一个Derived类。 Base类的唯一目标是确保Derived实现成员函数。

struct Base
{
    virtual void f() = 0;
};

struct Derived : Base
{
    void f() override final {}
};

我不会多态地使用此类,即,我只是实例化堆栈上类型为Derived的对象,如下所示:

Derived obj;

而且我需要这样做数百万次。

Edit:同时只有几个实例(没有堆栈溢出)。

是否在这里创建了vtable(我猜是在编译期间)?是否创建vtable对我来说很重要,因为我不使用它(或者我是否以某种方式)?我应该考虑使用这种设计吗?也许还有另一种方法可以确保编译器在Derived未实现f()时抱怨?

c++ compiler-optimization virtual-functions vtable dynamic-dispatch
1个回答
3
投票

是否在此处创建了vtable?

是,因为您具有virtual成员函数。

是否创建了vtable对我来说很重要,因为我不使用它

由于您不使用它,因此它在一定程度上仍然很重要,因为它将增加Derived结构的大小。这里您的Derived结构的大小为8。但是如果没有vtable,它的大小将为1。

也许还有另一种方法来确保编译器在Derived未实现f()时抱怨?

老实说,我认为您使用Base作为接口以强制每个派生类实现f()函数的解决方案是完全可以的,因为它是使用接口的确切用例] >。


但是如果您担心Derived结构的大小(因为您说过要实例化它数百万次),也许您会对std::is_member_function_pointer类型特征感兴趣。

我不知道您打算如何实例化std::is_member_function_pointer结构,因此我无法提供完全适合您需要的代码。但是我正在考虑的想法等同于以下示例(通用示例):

Derived

但是请记住,这种方法的缺点是延迟了检查。当遇到结构定义但在评估 #include <type_traits> template <typename T> void instantiate_a_lot_of_times(std::size_t nb_times) { // Check if the f() member function exists static_assert(std::is_member_function_pointer<decltype(&T::f)>::value, "Error: The T::f() member function must be defined"); for(std::size_t i = 0; i < nb_times; ++i) { T t; // Do something with t } } 时,编译不会失败。

© www.soinside.com 2019 - 2024. All rights reserved.