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

时间:2017-12-02 08:33:15

标签: c++ arrays dynamic-arrays

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

起初我按照以下方式初始化数组:

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

for (int i=0; i < arraySize; i++)
  heaps[i] = nullptr;

但是,由于这个函数被多次调用,for循环会减慢我的程序(我需要函数按logn的顺序,但是这个for循环开头已经按顺序排列了n)。

然后我看到了另一种初始化动态数组的方法,如下所示:

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

我的程序似乎与上面的行一致,但是,我不确定两种方法之间的区别是什么,以及它是否真的提高了性能(因为我无法识别性能差异很大)。

任何人都可以解释一下吗?

2 个答案:

答案 0 :(得分:2)

您要问的额外“()”称为初始化程序。除非您提供的类型是auto,否则它是可选的,在这种情况下,类型将从您提供的初始化程序中推断出来。

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

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

最终结果是相同的。第二个例子依赖于你的实现来为你提供零初始化指针,但是如果它没有你的for循环那么快或者快,我会感到惊讶。在性能方面,请始终进行衡量。

http://en.cppreference.com/w/cpp/language/new

答案 1 :(得分:0)

使用std::vector<node*>默认初始化值初始化数组。循环中的性能优势最小,因为它完成相同的工作。但是,如果因此导致性能下降,那么您必须查看代码/算法中的其他位置,以确定是否有任何内容可以移动到不那么热门的代码路径

如果您必须使用动态数组,请在编译时知道std::array<node*,N>时使用Nusing node_ptr = std::unique_ptr<node>; std::vector<node_ptr> heaps;

甚至更好,使用现代C ++设施:

var app = new PIXI.Application(400, 400, { antialias: true }); document.body.appendChild(app.view); // Render the compass var compassContainer = new PIXI.Container(); var compass = new PIXI.Graphics(); compass.beginFill(0xFF3300); compass.lineStyle(4, 0xffd900, 1); compass.lineStyle(0); compass.beginFill(0xFFFF0B, 0.5); compass.drawCircle(180, 180, 180); compass.endFill(); compass.lineStyle(0); compass.beginFill(0xFFFFFF, 1); compass.drawCircle(180, 180, 150); compass.endFill(); compass.lineStyle(4, 0xFF0000, 1); compass.moveTo(180, 20); compass.lineTo(180, 40); compassContainer.addChild(compass); app.stage.addChild(compassContainer); // Render the boat var boat = new PIXI.Graphics(); boat.beginFill(0xFF3300); boat.lineStyle(4, 0xffd900, 1); boat.moveTo(200, 100); boat.lineTo(175, 250); boat.lineTo(225, 250); boat.lineTo(200, 100); boat.endFill(); // Add boat app.stage.addChild(boat); compassContainer.position.set( 200, 200 ); compassContainer.pivot.x = compassContainer.width / 2; compassContainer.pivot.y = compassContainer.height / 2; app.ticker.add(function(delta) { // rotate the container! // use delta to create frame-independent tranform compassContainer.rotation -= 0.01 * delta; });