我正在用 C++ 做大学作业。我主要接受的是 C 语言教学,因此我正在努力练习更“惯用的”C++。
在 C 语言中,我在使用大型动态分配数组时没有遇到任何问题:
int* board = (int*) malloc(2048 * 2048 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
在C++中,据我了解,malloc不应该使用,也不应该使用newand delete,相反 RAII 才是王道。与其自己担心内存的分配和释放,我更愿意使用 STL。
但是,此代码不会运行(但会编译):
std::array<int, 2048 * 2048> board;
Run Code Online (Sandbox Code Playgroud)
使用 Valgrind,我注意到尝试在堆栈上分配的内存量(大约 840 万int秒)远远超出了操作系统愿意做的事情。
C++ 处理大型数组的方式是什么?
一般来说,来自C:
int foo[10]->std::array<int, 10> fooint* foo = malloc(10 * sizeof(int))->std::vector<int> foo(10)std::array直接包含其所有元素,就像 C 数组一样。事实上,它本质上只是简单的结构,如下所示:
template <typename T, size_t N>
struct array
{
T __unspecified_name[N];
// Some member functions
};
Run Code Online (Sandbox Code Playgroud)
另一方面,std::vector动态为其元素分配存储空间,就像您手动使用malloc;一样。它只是在需要时自动管理重新分配更多存储,并在析构函数中释放分配的存储。
另一种替代方案malloc是智能指针,例如std::unique_ptr<int[]> foo = std::make_unique<int[]>(10). 这在某些特定情况下很有用(即,当内存或代码大小非常紧张,或者您特别需要仅移动语义时)。这有点偏离了观点,但在我看来,std::vector如果你没有特定的理由使用其他东西,你通常应该更喜欢。
| 归档时间: |
|
| 查看次数: |
207 次 |
| 最近记录: |