使用静态分配的数组与使用指针和动态分配的权衡是什么?

计算科学 C++ 蒙特卡洛 浮点
2021-12-05 00:46:02

我正在用 C++ 学习蒙特卡洛模拟。我首先阅读 2D Ising 模型和 XY 模型的代码(来自互联网和教科书)。我发现有些人简单地通过二维数组来定义自旋int s[i][j],但是,有些人将向量与int *sint **s一起使用new int将值分配给旋转时,代码的主体也有些不同,我认为这种情况仅适用于二维数组更具可读性。

问这个问题可能很天真,但是任何人都可以帮助我了解使用向量和new int类型变量的优势吗?也欢迎参考。

1个回答

用括号分配的数组,如 int s[i][j] 的大小固定为 ixj,而用 new 和 int *s / int **s 分配的数组不一定深度一致,可以通过随后调用 new 来调整大小. 如果您在固定网格上求解,则无需调整数组大小,因此上述两个选项将具有相似的性能。您可以在此处找到更多详细信息:https ://stackoverflow.com/questions/17775066/cc-performance-of-static-arrays-vs-dynamic-arrays

第三种选择是使用 std::vector。Std:vectors 有一些不错的功能,例如当您使用 at 尝试访问不存在的索引时抛出越界异常。另一方面,C 风格的数组只会尝试理解它们给定的内存地址中发生的任何事情。也就是说,使用多个维度的嵌套向量可能会变得很难看。