【问题标题】:How to detect if an object is made up primarily of stack or dynamic memory如何检测对象是否主要由堆栈或动态内存组成
【发布时间】:2016-07-22 16:13:14
【问题描述】:

我目前一直在使用一个可能会创建重量级对象的库。具体来说,我正在创建与波形文件关联的对象。

现在在创建 Wave Object 的实例时(仅作为示例),有没有一种好方法可以确定它在内存中的分配位置?

例如,如果我要在堆栈中实例化一个 std::vector,我知道在堆栈上分配了一些内存(即头信息),并且在堆上创建了实际的容器数据。所以在大多数情况下,我不必担心堆栈内存溢出。虽然我仍然可以选择在堆中完全实例化对象。

但是假设我不知道对象的实现。假设我正在使用一个在堆栈中创建大量数组的库。这可能会导致问题。

所以我的问题是:我们如何知道一个对象在内存方面有多“重”?

【问题讨论】:

  • 简短的回答是:你不能。至少除非您使用工厂部件,否则至少不会,它总是在堆上实例化您的对象。当然,在这种情况下,答案总是“堆”。

标签: c++ c++11 dynamic-memory-allocation stack-memory


【解决方案1】:

我将假设分配堆栈内存的超标准方法不在讨论范围内(alloca 和朋友们)。

鉴于此,很简单:获取sizeof 对象。

C++ 是一种静态类型语言,但它的对象也是静态的大小。每种类型都有一个必须在编译时确定的大小。许多 C++ 依赖于此。因此,如果您担心某个对象占用了太多堆栈空间,那可能只是因为该对象占用了该空间的sizeof

请注意,这不会防止您调用本身使用大量堆栈空间的函数时出现问题。你无法检测到这一点。但是您可以通过任意测量来判断给定对象的大小是否“大”。

【讨论】:

  • 我明白了。出于某种原因,我认为您可以拥有一个具有成员 std::array 的对象,其大小可能会根据对象构造函数调用而有所不同......但是数组的大小必须是固定的并且不能改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 2017-11-08
  • 2018-01-06
  • 2017-01-17
  • 2012-01-29
  • 2019-05-17
相关资源
最近更新 更多