C++ 对象的动态数组-初始化方法之间的差异

C++ 对象的动态数组-初始化方法之间的差异,c++,arrays,dynamic-arrays,C++,Arrays,Dynamic Arrays,我需要在一个函数中创建节点对象的动态数组,该函数执行一些我将不深入研究的逻辑。 对于不同数量的节点(节点数量递增,直到超过一百万个节点),将连续多次调用此函数 首先,我以以下方式初始化数组: node** heaps = new node*[arraySize]; for (int i=0; i < arraySize; i++) heaps[i] = nullptr; 我的程序似乎与上面这一行的工作原理相同,但是,我不确定这两种方法之间的区别是什么,以及它是否真的提高了性能(因为

我需要在一个函数中创建节点对象的动态数组,该函数执行一些我将不深入研究的逻辑。 对于不同数量的节点(节点数量递增,直到超过一百万个节点),将连续多次调用此函数

首先,我以以下方式初始化数组:

node** heaps = new node*[arraySize];

for (int i=0; i < arraySize; i++)
  heaps[i] = nullptr;
我的程序似乎与上面这一行的工作原理相同,但是,我不确定这两种方法之间的区别是什么,以及它是否真的提高了性能(因为我不能确定有什么大的性能差异)

有人能解释一下吗?

使用
()
将默认初始化值初始化数组。在整个循环中,性能效益最小,因为它完成相同的工作。但是,如果因此导致性能下降,那么您必须查看代码/算法中的其他地方,以确定是否有任何内容可以移动到不太热的代码路径

如果必须使用动态数组,请在编译时使用
std::vector
std::array
(如果您知道
N

或者更好的是,使用现代C++设备:

使用node_ptr=std::unique_ptr;
向量堆;

使用
()
将默认初始化值初始化数组。在整个循环中,性能效益最小,因为它完成相同的工作。但是,如果因此导致性能下降,那么您必须查看代码/算法中的其他地方,以确定是否有任何内容可以移动到不太热的代码路径

如果必须使用动态数组,请在编译时使用
std::vector
std::array
(如果您知道
N

或者更好的是,使用现代C++设备:

使用node_ptr=std::unique_ptr;
向量堆;

您询问的额外“()”称为初始值设定项。它是可选的,除非您提供的类型是自动的,在这种情况下,类型将从您提供的初始值设定项中推导出来

在第一个示例中,节点指针是默认初始化的,这意味着它们的值是不确定的。他们可以指着任何东西

在第二个示例中,节点指针是值初始化的,这意味着它们都是空指针

无论哪种方式,最终结果都是一样的。第二个示例依赖于您的实现为您提供零初始化指针,但是如果它没有for循环那么快,我会感到惊讶。当谈到绩效时,总是要衡量

您询问的额外“()”称为初始值设定项。它是可选的,除非您提供的类型是自动的,在这种情况下,类型将从您提供的初始值设定项中推导出来

在第一个示例中,节点指针是默认初始化的,这意味着它们的值是不确定的。他们可以指着任何东西

在第二个示例中,节点指针是值初始化的,这意味着它们都是空指针

无论哪种方式,最终结果都是一样的。第二个示例依赖于您的实现为您提供零初始化指针,但是如果它没有for循环那么快,我会感到惊讶。当谈到绩效时,总是要衡量


这是错误的。
()
导致值初始化,而不是默认初始化,这与指针数组的行为不同。不幸的是,我不允许使用向量(赋值要求)。尽管他对C++11的特性提出了很好的观点,但我还是很欣赏他的回答。我认为,通过使用一系列独特的PTR,您的代码可能仍然会得到改进。您甚至可以通过将数组大小作为函数参数传递来避免动态数组分配,但如果您谈论的是数百万个节点,则可能会导致堆栈溢出。@tweej,对不起,我的错。修复了从
默认值
的错误。
()
导致值初始化,而不是默认初始化,这与指针数组的行为不同。不幸的是,我不允许使用向量(赋值要求)。尽管他对C++11的特性提出了很好的观点,但我还是很欣赏他的回答。我认为,通过使用一系列独特的PTR,您的代码可能仍然会得到改进。您甚至可以通过将数组大小作为函数参数传递来避免动态数组分配,但如果您谈论的是数百万个节点,则可能会导致堆栈溢出。@tweej,对不起,我的错。修正了从
默认值
。谢谢!我将确保更好地查看文档,因为我对C++还是比较陌生的。谢谢!我将确保更好地查看文档,因为我对C++使用std::vector还是比较陌生的。好的,你不允许使用std::vector:YAIT(另一个不称职的老师)。使用std::vector.Ok,你不允许使用std::vector:YAIT(另一个不称职的老师)。
node** heaps = new node*[arraySize]();