【问题标题】:How is the memory of a class handled in C++? [duplicate]C++ 中如何处理类的内存? [复制]
【发布时间】:2011-06-08 18:44:33
【问题描述】:

可能重复:
How are objects stored in memory in C++?

例如一个 C++ 类:

A类{
 整数值;
 无效的 addOne(){
  价值++;
 }
}

A类的实例会被这样加载吗[伪代码]:

[A的标识符] [这是整数值] [这是 void addOne(void)][value++] 或者像这样:
[A的成员标识符]
[这是整数值]

[A 的函数标识符] [this is void addOne(ref to member of A)][A.value++]

其次应该在类的多个实例上使用更少的内存。因为所有实例都使用相同的功能。 C++中的内存是如何处理的?是否可以更改内存处理?

【问题讨论】:

  • “A 的标识符”是什么意思?还是“A的成员标识符”?
  • 真的很抱歉,这不是一个正确的副本。
  • 这能回答你的问题吗? stackoverflow.com/questions/2006504/…

标签: c++ memory


【解决方案1】:

如果您的问题是关于 A 类的内存布局,则它与具有结构 A 相同,即整数值。 4 个字节(或该平台的任何 int 字节)。
函数不是内存布局的一部分,例如作为存储在函数或类似内容中的指针,因此它们不会影响类的大小。
如果类 A 虽然是多态类,则大小会有所不同,因为它还包含指向 vtable 的指针。

【讨论】:

    【解决方案2】:

    您是在问成员函数是否存储在类的实例中?不,每个实例使用相同的功能,它的[实例的]地址作为隐藏参数this传递。

    【讨论】:

    • 差不多就是这个。我还要添加一条注释,说明在任何地方都找不到类标识符,除非您调用 typeid()。
    • 是的,这是我的问题。我想我需要手工做这样的事情。谢谢。
    【解决方案3】:

    布局其实更像这样:

    类实例:

    [this is int value]
    

    其他地方:

    [this is void addOne(ref to member of A)][A.value++]
    

    也就是说,一个类(确切地说)由它的成员变量和它的基类组成,仅此而已(除非你的类包含虚函数,在这种情况下它还包含一个虚函数表)——尤其是没有“标识符”。

    其功能相同,它们完全存储在其他地方,而不是每个类实例一次。此外,类的函数既不包含对其类的引用,也不包含对其成员的引用。它只是一个内存代码块(机器代码语句)。调用该函数时,您(基本上)在将指向类实例的指针压入调用堆栈后跳转到该位置。然后,该方法可以通过访问堆栈上的指针来访问实例(及其成员)。

    【讨论】:

    • 我的意思是这样用空行。应该写得更清楚。
    【解决方案4】:

    好吧,在 Randall' Hyde's Write Great Code Volume 2 (好书,如果你有空闲时间阅读它)有一个部分就是关于这个的。简而言之,一个类像structs 一样保存变量,但它有一个记录,该记录保存指向该类中声明的函数的指针(VMT):

    VMT 代表虚拟方法表, 这 4 个字节包含一个指向 一个“方法指针”数组 班级。虚拟方法(也称为 C++ 中的虚成员函数)是 特殊的类相关函数 您在类中声明为字段。
    [...]
    调用虚拟成员函数 需要两次间接访问。第一的, 程序必须获取 VMT 来自类对象的指针并使用 间接获取特定的 来自 VMT 的虚拟功能地址。 然后程序必须制作一个 间接调用虚拟成员 通过指针函数 it 从 VMT 检索。
    [...]
    对于给定的类,只有一个 内存中的 VMT 副本。这是一个 静态对象,所以一个的所有对象 给定的类类型共享相同的 VMT。

    【讨论】:

    • 这并不完全正确。首先,在 C++ 中,类和结构在内存布局方面没有区别。其次,问题中的示例没有 vtable/VMT,因此这种描述具有误导性。
    • @Konrad:我刚刚从那本书中复制了=P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2018-05-11
    • 2020-02-29
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多