Ale*_* Li 2 c++ struct function
在结构(或类)中,我知道我可以添加一个函数,然后再调用它。
struct State {
int turnsLeft;
void nextTurn() {
turnsLeft--;
}
};
State s1{1};
State s2{2};
s1.nextTurn();
Run Code Online (Sandbox Code Playgroud)
我的问题是,这些函数与结构占用的空间有什么关系?我知道 int 是 4 个字节,因此创建 s1 和 s2 至少需要 4*2=8 个字节。但是,每次我创建一个新结构时,都会创建这个函数的一个新副本,还是无论State我创建多少个不同的函数,都只会创建和共享该函数的一个副本?如果每次都复制该函数,如何编写代码以便只制作该函数的一个副本?静态函数不能很自然地工作,因为我想this在修改turnsLeft.
我想我需要从一个免责声明开始:我在下面所说的适用于所有已知的实现。从理论上讲,有人可以对事情有所不同(但在这种情况下,它不太可能,即使作为智力练习也几乎不值得考虑)。
成员函数只会以一种方式影响类的大小:如果类至少包含一个虚函数,则类的大小将增加一个指针(通常称为 vtable 指针)的大小。即使该类不直接定义任何虚函数,如果它从至少声明了虚函数的基类继承,它将具有该类的 vtable 指针。如果它继承自多个基类,它通常会为每个基类包含一个 vtable 指针,该指针至少声明一个虚函数。virtual在一些特定情况下,使用继承可以减少这种情况。
但是不,一个类的对象通常不“包含”该类的函数的实际副本,因此正常成员函数的大小、复杂性或数量不会影响复制一个函数的大小或时间该类的对象。虚拟函数可以产生一些影响,但它通常仍然很小。
不过,成员函数确实会影响另一件事:非静态成员函数可以访问调用它们的对象中的数据。在成员函数内部,指向该对象的指针显示为this。在大多数实现中,即使它不是一个可见的参数,this实际上也是作为参数传递的,所以如果你查看生成的代码,它会包含一两条指令this,在调用之前加载到某个已知位置。但这只会影响调用成员函数的代码大小,而不影响该类对象的大小。