【发布时间】:2018-02-16 19:36:05
【问题描述】:
所以我在玩 C++ 特性,发现 C 风格的函数指针和 C++ 方法之间有很大的不同。这是我的意思:
typedef struct _myStruct {
void (*myFunctionOne)();
void(*myFunctionTwo)();
void(*myFunctionThree)();
} myStruct;
大小为 3 * 4 = 12 字节。
typedef struct _emptyStruct {
} emptyStruct;
大小为 1 个字节。
class myClass {
void myMethodOne();
void myMethodTwo();
void myMethodThree();
};
大小为 1 字节,就像这是一个空结构体。
为什么是空的?如果 C++ 方法不是函数指针,它们是如何实现的?如果没有任何指针,类如何“知道”它的方法?这个问题实际上并没有让我很困扰,但它引起了我的好奇心。
【问题讨论】:
-
成员函数的工作方式与常规的旧免费函数相同。您也不需要函数指针来调用它们。
-
非虚拟成员函数只是作用域中的函数——实例中没有指针。虚函数也不会有实例中每个函数的指针,只有一个 vtable 指针。
-
这是一个大主题。你最好得到一个nice C++ book 来解释 C++ 的整个方面
-
在不相关的注释中,
_myStruct结构的大小不能保证为 12 字节。它可以更多(或更少,尽管可能性不大)。 -
尝试将方法声明为虚拟方法并再次运行测试。