【问题标题】:How to determine the memory of a c++ object at runtime如何在运行时确定 c++ 对象的内存
【发布时间】:2011-05-29 16:10:36
【问题描述】:

我试图在运行时确定对象的大小。 sizeof 不起作用,因为这会在编译时返回大小。这是我的意思的一个例子:

class Foo 
{
public:
    Foo() 
    {
        c = new char[1024*1024*1024];
    }
    ~Foo() 
    { 
        delete[] c; 
    }

private:
    char *c;
};

在这种情况下,sizeof(Foo) 将是 4 个字节,而不是 ~1GB。如何在运行时确定 Foo 的大小?提前致谢。

【问题讨论】:

标签: c++ memory memory-management runtime


【解决方案1】:

对象的大小 4 字节在您的系统上。但是,该对象会使用额外的资源,例如 1GB 内存。

【讨论】:

    【解决方案2】:

    Foo 的大小是恒定的。 ~1GB 的字符在技术上不属于该对象,只是指向它的指针。这些字符只被对象所拥有,因为对象负责为它们分配和释放内存。 C++ 不提供允许您找出对象已分配多少内存的功能。您必须自己跟踪。

    【讨论】:

      【解决方案3】:

      您需要以某种方式自己跟踪它。例如:

      struct Foo 
      {
          Foo()
              : elements(1024 * 1024 * 1024) 
          {
              c.reset(new char[elements]);
          }
      
          boost::scoped_array<char> c;
          int elements;
      };
      

      请注意,您应该使用智能指针容器来管理动态分配的对象,这样您就不必手动管理它们的生命周期。在这里,我演示了scoped_array 的使用,这是一个非常有用的容器。您还可以使用 shared_array 或将 shared_ptr 与自定义删除器一起使用。

      【讨论】:

      • 这是一个很好的答案。但是,我正在尝试确定我自己没有编写的对象的内存使用情况。具体来说,stl string、stl wstring 和 ICU UnicodeString 都填充了相同的数据。每个都有返回内部缓冲区大小但不返回整个对象大小的函数。使问题复杂化的是,这些对象可能包含指向其他数据的指针。有什么想法吗?
      • @Dr.杰:你可以估计,但这是你能做的最好的。对于std::stringstd::wstring,您可以获得s.size() 来查找它们所拥有的缓冲区的大小(注意它是以字符为单位的,因此您必须将wstring 的结果乘以sizeof(wchar_t)获取大小(以字节为单位)并将其添加到对象sizeof(s) 的大小。对于其他类型,您必须确定它们是否暴露了它们所包含内容的大小。无论如何,这只是一个估计值,因为底层缓冲区可能更大(例如,对于vectorv.capacity() 可能大于v.size())。
      猜你喜欢
      • 2016-10-05
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 2015-07-17
      相关资源
      最近更新 更多