C++ 为什么功能是失重的?

C++ 为什么功能是失重的?,c++,C++,为什么在我的类中使用函数不会改变这个类的大小?这些信息必须存储在某个地方,但存储在何处?我认为(大多数时候我都是错的),如果只在类中声明一个非虚拟函数,而没有实现,链接器可能会将其全部删除 class Toto { int foo(); }; M.您可以认为成员函数与任何其他函数一样,只是它有一个额外的隐藏参数,该参数使用指向调用成员函数的实例的指针 例如,这: class C { void f(int i) { } }; 可能实施(至少在概念上)为: 如果它是常量成员函数,则隐

为什么在我的类中使用函数不会改变这个类的大小?这些信息必须存储在某个地方,但存储在何处?

我认为(大多数时候我都是错的),如果只在类中声明一个非虚拟函数,而没有实现,链接器可能会将其全部删除

class Toto
{
  int foo();
};

M.

您可以认为成员函数与任何其他函数一样,只是它有一个额外的隐藏参数,该参数使用指向调用成员函数的实例的指针

例如,这:

class C
{
    void f(int i) { }
};
可能实施(至少在概念上)为:


如果它是常量成员函数,则隐藏参数的类型将改为
const C*
。请注意,对于虚拟成员函数,情况远没有这么简单。

类的大小只受类内的数据成员影响,如果有,则加上vtable,如果有,则加上填充字节。因此,向类中添加非虚拟函数不会影响其大小。如果类已经包含一个虚拟函数,添加第二个函数也不会改变(类)的大小。

通过“这个类的大小”,你是指对象文件的大小,还是
sizeof(类)
,或者…?学会问更好的问题。就像在你的问题中陈述什么是“fnc”。@知道:你不仅令人讨厌,而且是错误的。一个方法得到一个隐式
this
指针,而一个函数没有。这些词的不同之处在于:它们指的是相似但不同的概念。@丹尼尔:在C++中,“方法”被简单地称为“非静态成员函数”。但是让我们把广告放在一边,让我们冷静下来,好吗?你的问题得到了答案,是吗?没有伤害,没有犯规。即使你有一个实现,大小也不会改变。成员函数(如果不是虚拟的)不存储在类实例中。一个程序中只有一个副本(忽略静态问题)。@知道:机器语言指令存储在可执行的二进制文件中,就像它们存储在程序中的任何其他函数中一样。如果你觉得你的评论很有趣,那你就不是了。@Daniel谢谢你的回答,而根据你的评论,我是在试图变得有趣?@Knowing:此信息静态链接到调用该方法的任何地方。@Knowing:这里不需要叫名字。这既粗鲁又不专业。@知道:地址是由编译器硬编码到调用函数中的,不需要在运行时将其作为对象的一部分。相反,虚拟函数仅在运行时解析,并将指向虚拟函数表的指针作为每个对象的开销添加。
void C_f(C* this, int i) { }