gpt4 book ai didi

c++ - 强制成员函数实现的开销

转载 作者:行者123 更新时间:2023-12-02 03:33:23 25 4
gpt4 key购买 nike

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

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

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

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

Derived obj;

我需要这样做数百万次。

编辑:仅同时存在几个实例(无堆栈溢出)。

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

最佳答案

Is a vtable created here ?

是的,因为您有虚拟成员函数。

Does it matter to me if a vtable is created or not, since I don't use it ?

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

Maybe there is another way to make sure the compiler complains if Derived doesn't implement f()?

说实话,我认为您使用 Base 作为接口(interface)来强制每个派生类实现 f() 函数的解决方案完全没问题,因为它是接口(interface)使用的确切用例

<小时/>

但是,如果 Derived 结构的大小是一个问题(因为您说您想实例化它数百万次),也许您会对 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
}
}

但请记住,这种方法有延迟检查的缺点。
当遇到结构体定义时,编译不会失败,但当static_assert被求值时。

关于c++ - 强制成员函数实现的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59783516/

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