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]();