如何检测对象是否主要由堆栈或动态内存组成
How to detect if an object is made up primarily of stack or dynamic memory
我目前一直在使用一个可能创建重量级对象的库。具体来说,我正在创建与波形文件关联的对象。
现在在创建 Wave 对象的实例时(仅作为示例),是否有一种好的方法来确定它在内存中的分配位置?
例如,如果我要在堆栈中实例化一个std::vector,我知道在堆栈上分配了一些内存(即头信息)并且在堆上创建了实际的容器数据。所以在大多数情况下,我不必担心堆栈内存溢出。尽管我仍然可以选择在堆中完全实例化对象。
但是假设我不知道对象实现。假设我正在使用一个在堆栈中创建大量数组的库。这可能会导致问题。
所以我的问题是:我们怎么知道 'heavy' 一个对象是内存明智的?
我假设分配堆栈内存的额外标准方法不属于 table(alloca
和朋友)。
鉴于此,很简单:获取 sizeof
对象。
C++ 是一种静态类型语言,但它的对象也是静态大小。每种类型都有一个必须在编译时可确定的大小。许多 C++ 都依赖于此。因此,如果您担心某些对象占用太多堆栈 space,那可能只是因为 sizeof
该对象占用了 space.
请注意,这不会阻止您调用 本身 使用大量堆栈 space 的函数的问题。你无法检测到这一点。但是您可以通过一些任意测量来判断给定对象的大小是否为 "large"。
我目前一直在使用一个可能创建重量级对象的库。具体来说,我正在创建与波形文件关联的对象。
现在在创建 Wave 对象的实例时(仅作为示例),是否有一种好的方法来确定它在内存中的分配位置?
例如,如果我要在堆栈中实例化一个std::vector,我知道在堆栈上分配了一些内存(即头信息)并且在堆上创建了实际的容器数据。所以在大多数情况下,我不必担心堆栈内存溢出。尽管我仍然可以选择在堆中完全实例化对象。
但是假设我不知道对象实现。假设我正在使用一个在堆栈中创建大量数组的库。这可能会导致问题。
所以我的问题是:我们怎么知道 'heavy' 一个对象是内存明智的?
我假设分配堆栈内存的额外标准方法不属于 table(alloca
和朋友)。
鉴于此,很简单:获取 sizeof
对象。
C++ 是一种静态类型语言,但它的对象也是静态大小。每种类型都有一个必须在编译时可确定的大小。许多 C++ 都依赖于此。因此,如果您担心某些对象占用太多堆栈 space,那可能只是因为 sizeof
该对象占用了 space.
请注意,这不会阻止您调用 本身 使用大量堆栈 space 的函数的问题。你无法检测到这一点。但是您可以通过一些任意测量来判断给定对象的大小是否为 "large"。