【问题标题】:member variable of a class needs more memory: address changes?类的成员变量需要更多内存:地址变化?
【发布时间】:2021-09-18 09:11:20
【问题描述】:

我想我的问题不需要最小的工作示例;这可能很简单,也很容易描述。

假设有一个类实例将一些对象存储为成员。现在其中一个成员在运行时增长。创建实例后 member1 消耗了 10 个字节, member2 消耗了 20 个字节。然后 object1 以某种方式被修改,现在需要 15 个字节。

我的问题是member1(的第一个字节)的地址是否不变?或者是否有可能 member1 的第一个字节现在有另一个地址? 成员变量是在堆上分配的吗?

感谢您的反馈!

最好的

【问题讨论】:

  • 对象不能在 C++ 中改变大小。这可能会对您有所帮助:stackoverflow.com/questions/55478523/…
  • "不需要最小的工作示例;"对不起,但你错了,因为“现在其中一个成员在运行时增长。”是对某些代码的误解。除非您显示,否则我们不知道该代码是什么
  • 如果某些东西在运行时动态增长,则可能涉及堆分配。虽然这可以通过stringvectormap 等东西抽象出来。但基本上这就是你获得可以“成长”的东西的方式。如果这看起来含糊不清,那么您需要一个更具体的问题/示例。
  • 我有一个 Class 实例,其成员来自外部库,我什至不知道他们如何在内部存储成员。但是我检查了一些东西:成员的地址没有改变,但它的内存消耗在运行时增加了。所以这只能使用堆分配,是吗?

标签: c++ object memory heap-memory stack-memory


【解决方案1】:

现在其中一个成员在运行时增长。

这种情况在 C++ 中是不可能的。对象的大小(以及类型的大小)在运行时是恒定的。

member1 现在和以前一样有另一个地址?

没有。对象的地址在其整个生命周期内都不会改变。

我有一个 Class 实例,其成员来自外部库,我什至不知道他们如何在内部存储成员。

成员变量的类型必须是完整的。这意味着必须已经定义了类型。如果它被定义,那么它的大小和内部成员都是已知的。您可能通过包含头文件来包含类型的定义。您可以阅读该标题以找出定义。

所以这只能使用堆分配,是吗?

不一定。例如,可能有一个预先分配的缓冲区,其中可以包含达到某个常数限制的对象。

但通常是的,动态对象使用动态存储。根据对内存使用量增加的观察,情况似乎如此。

【讨论】:

  • "不。对象的地址在其整个生命周期内永远不会改变。"只是为了确定,对象的地址以及所有成员的地址都不会改变,对吗?
  • @Simon 数据成员也是对象(除非它们是引用),这适用于所有对象。 (引用不是对象,也没有地址 - 或者至少是您可以在 C++ 语言中访问的任何地址。此外,很少使用引用成员)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多