double*** allocate3D(int x, int y, int z) {
double*** arr = new double**[x]; // 第 1 維:指標陣列
for (int i = 0; i < x; ++i)
arr[i] = new double*[y]; // 第 2 維:指標陣列
for (int i = 0; i < x; ++i)
for (int j = 0; j < y; ++j)
arr[i][j] = new double[z]; // 第 3 維:實際資料
return arr;
}
void deallocate3D(double*** arr, int x, int y) {
for (int i = 0; i < x; ++i)
for (int j = 0; j < y; ++j)
delete[] arr[i][j];
for (int i = 0; i < x; ++i)
delete[] arr[i];
delete[] arr;
}
缺點:記憶體不連續(緩存不友好)、釋放順序易錯、異常安全差、語法繁瑣、無邊界檢查。
std::vector 扁平化(最高效、最推薦)class Matrix3D {
size_t X_, Y_, Z_;
std::vector data_; // 連續記憶體
public:
Matrix3D(size_t x, size_t y, size_t z) : X_(x), Y_(y), Z_(z), data_(x * y * z) {}
double& operator()(size_t x, size_t y, size_t z) {
return data_[x * Y_ * Z_ + y * Z_ + z];
}
double const& operator()(size_t x, size_t y, size_t z) const {
return data_[x * Y_ * Z_ + y * Z_ + z];
}
// 可加入邊界檢查 at() 版本
};
優點:單次配置、連續記憶體、RAII 自動釋放、緩存友好、支援 data() 互操作 C API。
std::vector>> (語意直觀,效能次之)using Matrix3D = std::vector>>;
Matrix3D create3D(size_t x, size_t y, size_t z) {
return Matrix3D(x, std::vector>(y, std::vector(z)));
}
優點:語法簡潔、自動管理、支援不規則陣列(鋸齒陣列)。
缺點:多次配置、記憶體碎片、指標追蹤開銷。
std::mdspan(非擁有視圖,配合 std::vector 數據)#include
#include
void process3D(std::vector& data, size_t x, size_t y, size_t z) {
std::mdspan> view(data.data(), x, y, z);
// view[i, j, k] 存取,零開銷、界限檢查可選
}
C++23 mdspan 提供多維陣列視圖,不擁有資料,適合高效能計算庫介面。
| 方案 | 配置時間 | 存取時間 | 記憶體開銷 | 備註 |
|---|---|---|---|---|
| 三重指標 | 慢(3萬次 new) | 慢(3次間接) | 高(指標陣列) | 教學參考 |
| vector 扁平化 | 極快(1次 new) | 最快(1次索引) | 最低 | 生產首選 |
| 巢狀 vector | 中(1萬次 new) | 中(3次間接) | 中 | 快速原型 |
| mdspan + vector | 極快 | 最快 | 最低 | C++23 新標準 |