11得票1回答
C++虚函数:链接器是否可以删除未被调用的虚函数表中的条目?

这个问题是消除未使用的虚函数的后续,但对我来说不够深入。 问题:当定义具有虚函数的类时,编译器为虚函数表分配存储空间,并在表中存储函数指针。这会导致链接器保留这些函数的代码,无论它们是否被调用。即使编译器优化设置要求消除死代码,这可能导致大量死代码保留在可执行文件中。 现在,如果在可执行文...

7得票1回答
为什么嵌入式平台上无法正确实施Vtables?

我正在为一款嵌入式系统(特别是PSoC 5,使用PSoC Creator)开发代码,并使用C++编写。 虽然我已经克服了使用C ++的大部分障碍,首先是使用编译器标志-x c ++进行编译,定义new和delete运算符,并确保使用编译器标志-fno-exception不会抛出异常。然而,当...

43得票3回答
虚函数调用的实现细节

首先,我想明确一点,我知道C++标准中没有虚函数表和虚函数指针的概念。然而,我认为几乎所有的实现都以非常相似的方式实现了虚函数调用机制(如果我错了,请纠正我,但这不是主要问题)。此外,我相信我知道虚函数如何工作,也就是说,我可以总是知道哪个函数将被调用,我只需要实现细节。 假设有人问我以下问...

11得票1回答
为什么虚表会有大小为sizeof(void*) * 2字节的0x00填充?

我想这取决于具体的实现,但对于使用libstdc++和libc++(gcc或clang)的armv7、arm64和x86_64构建,似乎虚函数表始终在开头有8个字节(64位系统上为16个字节)的填充,获取虚函数表通常是这样的:ldr.w r0, <address of vtable&gt...

9得票4回答
如何摆脱虚拟表?密封类

据我所知,将类设为sealed会消除VTable中的查找,我是否正确?如果我将一个类设为sealed,这是否意味着类层次结构中的所有虚方法也被标记为sealed? 例如: public class A { protected virtual void M() { ........ ...

26得票4回答
在C语言中的动态方法调用

我知道这听起来很傻,也知道C语言不是面向对象的语言。 但是有没有办法在C语言中实现动态方法调度? 我考虑过使用函数指针,但不能完全理解这个想法。 我应该如何实现呢?

12得票4回答
如何确定带有虚函数的类的大小?

这是一个作业问题。对于以下代码:#include <iostream> using namespace std; class A { public: virtual void f(){} }; class B { public: virtual void f2(...

10得票3回答
多重虚拟继承和类型转换的虚拟表和虚拟指针

我对vptr和内存中对象的表示有点困惑,希望你能帮助我更好地理解这个问题。 考虑类B继承自A,两个类都定义了虚函数f()。根据我的理解,类B的一个对象在内存中的表示形式如下:[ vptr | A | B ],并且vptr所指向的vtbl包含。我也理解将对象从B转换为A除了忽略对象结尾的B部...

40得票5回答
打印虚拟成员函数的地址

我正在尝试打印虚拟成员函数的地址。 如果我知道哪个类实现了该函数,我可以编写: print("address: %p", &A::func); 但是我想要做类似这样的事情: A *b = new B(); printf("address: %p", &b->fu...

10得票1回答
“手工制作”的vtable方法有什么优势?

最近,我遇到了一些使用“手写”vtable的类型抹消实现,Adobe ASL的any_regular_t是一个例子,尽管我也在Boost ASIO中看到它被使用(用于完成例程队列)。 基本上,父类型接收一个指向子类型中充满函数指针的静态类型的指针,类似于以下内容... struct par...