【问题标题】:Dynamic allocation to array of pointers and its alternatives动态分配指针数组及其替代方案
【发布时间】:2017-05-05 10:05:03
【问题描述】:

使用 new int 分配数组的标准方法是:

 int* arr = new int[50];

以这种方式声明它时,将有连续的内存分配,并且变量堆栈中将有一个数组变量。

如果我想以 50 个不同的指针变量的形式声明它,以便每个指针具有不同的内存地址并且不一定是连续的,那么最明显的方法是这样的:

int * arr[50];

但是以这种方式分配内存的命令/代码是什么(即通过 new int )以及以每种方式声明的缺点或优点是什么。

【问题讨论】:

  • for(int i=0;i
  • 为了轻松生活,请使用std::vector<int>
  • 如果您能分享您这样做的动机,那就太好了。
  • 我只是好奇内存在分配过程中是如何工作的。
  • 我不会以“标准方式”称呼int *arr = new int[50];。这是你应该很少写到永远不会写的东西。也许在非常古老的教科书中提到过。

标签: c++ arrays pointers memory-management dynamic-allocation


【解决方案1】:

显而易见的方法是遍历所有元素并为它们分配内存:

for (int i = 0; i < 50; i++){
    arr[i] = new int;
}

非连续内存块的缺点是缓存未命中。 你可以阅读更多关于here的信息。

【讨论】:

  • for (int i = 0; i
  • 假设arr 没有衰减。
  • 除了缓存未命中之外会不会还有指针解引用开销?
  • @olegst 是的,但这没什么大不了的,你希望它被优化为每个条目发生一次。我认为除非是用于库,否则我只会使用宏。
  • @George 无论如何,我认为以这种方式比较连续和非连续内存访问是不正确的,因为这样做应该访问分散在内存中的条目(而不是一个接一个地放置),即与取消引用指针数组不同(顺便说一下,这些指针很可能指向后续地址)。作者最好解释一下他们到底想达到什么目的。
【解决方案2】:

如何赋值,在this answer中已经提到;因此不再重复。
对于单个 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

“避免使用指针,直到你不能......所以经验法则是只有在没有其他选择时才使用指针。”

【讨论】:

  • 是 std::array vi;类似于有 50 个不同的变量,每个变量都有不连续的内存分配?
  • @PranjalMisra,请参阅 std::array&lt;int, 50&gt;。这是int [50] 的更好选择。因为,它也将有 连续 内存分配,但支持 exception。对于“超出范围”的数组问题,引发运行时异常。如果您必须在编译时间和动态之间进行选择,请选择编译时间。因为它是有效的和确定性的。此外,在动态分配中,如果您可以在连续和非连续之间进行选择,则选择连续。因为它在内存中的漏洞会更少,并且未来的分配会更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 2013-12-17
  • 2013-05-26
  • 2020-05-17
  • 1970-01-01
相关资源
最近更新 更多