gpt4 book ai didi

c++ - 一个非内联非虚方法给一个类的实例增加了多少字节? C++

转载 作者:太空狗 更新时间:2023-10-29 23:53:42 24 4
gpt4 key购买 nike

以这两个类为例(C++)

class B1 {
public:

};

class B2 {
public:
void f0 () {}
void f1 () {}
};

B2 类在内存中比 B1 大多少

我觉得这是两个答案之一:

32 位系统 PER 方法上的单个 4 字节 int 指针。

或者类似于虚拟方法表发生的事情 http://en.wikipedia.org/wiki/Virtual_method_table

哪里会有一个 4 字节的 int 指针指向每个类的一个表,这样它就可以查找它的方法,这是有道理的,但我不知道这是否发生在非虚拟方法。

谢谢。

编辑:感谢所有精彩而快速的回复 :)(也标记为答案)

最佳答案

无。

非虚拟方法不会增加类的大小。

对于 virtual 方法,只有第一个添加到类中的方法会增加其大小,所有后续方法都不会。

它是否是内联这一事实也不影响类(class)规模。

这样做的原因是不需要额外的内存。试想一下,如果所有类的所有实例都持有指向该类和所有父类中所有方法的指针。那将是对内存的巨大浪费。

B2 b;
b.f0();

编译器可以简单地生成代码来调用B2::f0()this 指针作为底层参数传递,以便该方法知道要对类的哪个实例进行操作。

对于一个简单的测试:

class B1 {
public:

};

class B2 {
public:
void f0 () {}
void f1 () {}
};

//...
assert( sizeof(B1) == sizeof(B2) );

关于c++ - 一个非内联非虚方法给一个类的实例增加了多少字节? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9572396/

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