动态数组内存分配与C++模板技术

在C++编程中,数组是一种基本的数据结构,用于存储固定大小的元素集合。然而,当数组的大小是可变的时候,不能像声明静态数组那样声明动态数组。例如,不能使用如下语法: int a[n1][n2]; 通常,会使用std::vector来创建动态数组,但这需要手动构造: int n1 = 5; int n2 = 6; std::vector> v; v.resize(n1); for(auto& vv : v) vv.resize(n2); 这种方法会多次分配内存,因此效率较低。希望能够一次性分配内存。但是,直接使用如下方法会导致崩溃: std::vector v(1000); int** n = (int**)v.data(); n[0][0] = 5; // boom 为了避免这种情况,需要使用循环来初始化内存。

C++11引入了变长模板,这为提供了帮助。可以编写一个递归函数,接受多个参数(声明数组的维度),并修改传递给它的内存指针,使其转换为多维数组是安全的。如果传递了nullptr,则返回分配所需的字节数。

例如,对于单维数组: int j = 0x21; size_t n1 = CreateArrayAtMemory(nullptr, 2); vector a1(n1); char* f1 = (char*)a1.data(); CreateArrayAtMemory(f1, 2); for(int i1 = 0; i1 < 2; i1++) { f1[i1] = j++; } for(int i1 = 0; i1 < 2; i1++) { std::cout << (int)f1[i1] << "\n"; } std::cout << std::endl << n1 << " bytes used\n"; 预期输出: 33 34 2 bytes used

现在,对于二维数组2x3的short int j = 0x21; size_t n2 = CreateArrayAtMemory(nullptr, 2, 3); vector a2(n2); short** f2 = (short**)a2.data(); CreateArrayAtMemory(f2, 2, 3); for(int i1 = 0; i1 < 2; i1++) { for(int i2 = 0; i2 < 3; i2++) { f2[i1][i2] = j++; } } // Dump for(int i1 = 0; i1 < 2; i1++) { for(int i2 = 0; i2 < 3; i2++) { std::cout << (int)f2[i1][i2] << "\n"; } } std::cout << std::endl << n2 << " bytes used\n"; std::cout << std::endl; 预期输出: 33 34 35 36 37 38 20 bytes used

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485