这是否含有C ++类的可变大小的数组使用动态存储器分配?
-
23-08-2019 - |
题
有没有做这样的事情使用动态内存分配?
template <class T, int _size>
class CArray
{
public:
...
private:
T m_data[_size];
};
可以给我这样的人解释这是怎么回事幕后当我创建的对象?
CArray<SomeObject, 32> myStupidArray;
解决方案
如在其它的答案中提到,模板是在编译时进行评价。如果你有兴趣,你可以有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
其他提示
没有,它将就地被分配(例如任一堆栈上,或作为含对象的一部分)。
使用模板的参数是在编译时评价因此您的代码有效地变成;
class CArray
{
public:
...
private:
SomeObject m_data[32];
};
模板在编译时被评估,所以M_DATA [_size]是编译为M_DATA [32]。
没有,它不使用动态存储器分配。编译器知道多少内存需要分配,它是在编译时决定,而不是在运行时。
这是没有任何意义,在这里解释C ++模板,它们是在其他页面中的 C ++ FAQ精简版。
阵列的大小是在编译时已知的,所以没有,也不会在这里使用动态存储器分配来。如果在功能范围声明数组然后它会被放置在栈上就像任何其他类型的对象。
当你定义可变大小的物体像这样,真正的情况是,编译器正在建立一个类定义“订购”。你只是使用“[32] T ... M_DATA”在它包含一个类定义。
1-模板仅在编译时进行评价。所以此数组的大小为32的
2-不能创建使用可变堆栈上的阵列,它必须是可以在编译的时候进行评估常数,否则可以使用新的(或malloc的)
动态存储器分配通常当调用new
操作者(或它的一个朋友)发生。这个分配的存储器从通常被称为堆的存储器备用块。请记住,不同于静态分配,编译器不照顾自由-ING存储器,所以你必须这样做使用delete
运营商(或其适当的版本)手动。
不隶属于 StackOverflow