【问题标题】:Does this C++ class containing a variable size array use dynamic memory allocation?这个包含可变大小数组的 C++ 类是否使用动态内存分配?
【发布时间】:2009-02-16 20:39:17
【问题描述】:

做这样的事情是否使用动态内存分配?

template <class T, int _size> 
class CArray 
{ 
public:
    ... 
private:
    T m_data[_size]; 
};

有人可以向我解释一下我创建对象时幕后发生了什么吗?

CArray<SomeObject, 32> myStupidArray;

【问题讨论】:

    标签: c++ templates memory-management


    【解决方案1】:

    不,它将就地分配(例如,在堆栈上,或作为包含对象的一部分)。

    使用模板,参数在编译时进行评估,因此您的代码有效地变为;

    class CArray 
    { 
    public:
        ... 
    private:
        SomeObject m_data[32]; 
    };
    

    【讨论】:

    • 重要的是要注意 CArray 本质上也是对象类型。换句话说,CArray 和 CArray 是完全不相关的类型。这通常无关紧要,但它可以。
    【解决方案2】:

    正如其他答案中提到的,模板是在编译时评估的。如果你有兴趣,你可以让 g++ 吐出你可以验证它的大小的类层次结构:

    template <class T, int _size>
    class CArray
    {
    public:
    private:
      T m_data[_size];
    };
    
    int main(int argc, char **argv) {
      CArray<int, 32> myStupidArray1;
      CArray<int, 8> myStupidArray2;
      CArray<int, 64> myStupidArray3;
      CArray<int, 1000> myStupidArray4;
    }
    

    -fdump-class-hierarchy编译:

    g++ -fdump-class-hierarchy blah.cc
    

    当前目录下应该有一个名为blah.cc.t01.class的文件:

    Class CArray<int, 32>
       size=128 align=4
       base size=128 base align=4
    CArray<int, 32> (0x40be0d80) 0
    
    Class CArray<int, 8>
       size=32 align=4
       base size=32 base align=4
    CArray<int, 8> (0x40be0e80) 0
    
    Class CArray<int, 64>
       size=256 align=4
       base size=256 base align=4
    CArray<int, 64> (0x40be0f80) 0
    
    Class CArray<int, 1000>
       size=4000 align=4
       base size=4000 base align=4
    CArray<int, 1000> (0x40be6000) 0
    

    【讨论】:

      【解决方案3】:

      Templates 在编译时计算,因此 m_data[_size] 编译为 m_data[32]。

      【讨论】:

        【解决方案4】:

        不,它不使用动态内存分配。编译器知道需要分配多少内存,它是在编译时决定的,而不是在运行时。

        在这里解释 C++ 模板没有任何意义,它们在其他页面上解释得很好,比如在 C++ faq lite

        【讨论】:

          【解决方案5】:

          数组的大小在编译时是已知的,所以不,这里不会使用动态内存分配。如果您在函数范围内声明数组,那么它将像任何其他类型的对象一样被放入堆栈。

          当您像这样定义可变大小的对象时,真正发生的是编译器正在构建一个“按顺序”定义的类。您将只使用其中包含“T m_data[32]”的类定义。

          【讨论】:

            【解决方案6】:

            1- 模板仅在编译时进行评估。所以这个数组的大小是 32

            2- 你不能使用变量在堆栈上创建数组,它必须是一个可以在编译时计算的常量,否则你可以使用 new(或 malloc)

            【讨论】:

              【解决方案7】:

              动态内存分配通常发生在您调用new 运算符(或其朋友之一)时。这从通常称为堆的内存保留中分配一块内存。请记住,与静态分配不同,编译器不负责释放内存,因此您必须使用 delete 运算符(或其合适的版本)手动完成。

              【讨论】:

                猜你喜欢
                • 2022-01-02
                • 1970-01-01
                • 2013-11-11
                • 2012-10-12
                • 2020-11-26
                • 2014-05-15
                • 2018-08-26
                • 2019-06-15
                • 1970-01-01
                相关资源
                最近更新 更多