指针数组的动态分配及其替代方案
Dynamic allocation to array of pointers and its alternatives
使用 new int 分配数组的标准方法是:
int* arr = new int[50];
以这种方式声明时,将进行连续的内存分配,并且变量堆栈中将有一个数组变量。
如果我想以 50 个不同的指针变量的形式声明它,以便每个指针都有不同的内存地址并且不一定是连续的,最明显的方法是这样的:
int * arr[50];
但是以这种方式分配内存的命令/代码是什么(即通过 new int )以及以每种方式声明的缺点或优点是什么。
显而易见的方法是遍历所有元素并为它们分配内存:
for (int i = 0; i < 50; i++){
arr[i] = new int;
}
非连续内存块的缺点是缓存未命中。
您可以阅读更多关于 here.
的内容
如何分配,在中已经提到;故不再赘述。
对于单个 int
分配,您的下面一行是矫枉过正:
int* arr[50]; // all downsides only
相反,您应该使用简单的整数:
int arr[50];
更好地利用标准容器的设施,例如:
std::vector<int> vi; // if the number of int-s are dynamic
std::array<int, 50> ai; // if the number of int-s are fixed
最后,来自this answer、
"Avoid pointers until you can't... So the rule of thumb is to use pointers only if there is no other choice."
使用 new int 分配数组的标准方法是:
int* arr = new int[50];
以这种方式声明时,将进行连续的内存分配,并且变量堆栈中将有一个数组变量。
如果我想以 50 个不同的指针变量的形式声明它,以便每个指针都有不同的内存地址并且不一定是连续的,最明显的方法是这样的:
int * arr[50];
但是以这种方式分配内存的命令/代码是什么(即通过 new int )以及以每种方式声明的缺点或优点是什么。
显而易见的方法是遍历所有元素并为它们分配内存:
for (int i = 0; i < 50; i++){
arr[i] = new int;
}
非连续内存块的缺点是缓存未命中。 您可以阅读更多关于 here.
的内容如何分配,在
对于单个 int
分配,您的下面一行是矫枉过正:
int* arr[50]; // all downsides only
相反,您应该使用简单的整数:
int arr[50];
更好地利用标准容器的设施,例如:
std::vector<int> vi; // if the number of int-s are dynamic
std::array<int, 50> ai; // if the number of int-s are fixed
最后,来自this answer、
"Avoid pointers until you can't... So the rule of thumb is to use pointers only if there is no other choice."