我需要在一个函数中创建一个动态的节点对象数组,该函数执行一些我不会深入研究的逻辑。 对于不同数量的节点,将连续多次调用此函数(节点数增量,直到超过一百万个节点)。
起初我按照以下方式初始化数组:
node** heaps = new node*[arraySize];
for (int i=0; i < arraySize; i++)
heaps[i] = nullptr;
但是,由于这个函数被多次调用,for循环会减慢我的程序(我需要函数按logn的顺序,但是这个for循环开头已经按顺序排列了n)。
然后我看到了另一种初始化动态数组的方法,如下所示:
node** heaps = new node*[arraySize]();
我的程序似乎与上面的行一致,但是,我不确定两种方法之间的区别是什么,以及它是否真的提高了性能(因为我无法识别性能差异很大)。
任何人都可以解释一下吗?
答案 0 :(得分:2)
您要问的额外“()”称为初始化程序。除非您提供的类型是auto,否则它是可选的,在这种情况下,类型将从您提供的初始化程序中推断出来。
在第一个示例中,您的节点指针是默认初始化的,这意味着它们的值是不确定的。他们可以指出任何事情。
在第二个示例中,您的节点指针是值初始化的,这意味着它们都是空指针。
最终结果是相同的。第二个例子依赖于你的实现来为你提供零初始化指针,但是如果它没有你的for循环那么快或者快,我会感到惊讶。在性能方面,请始终进行衡量。
答案 1 :(得分:0)
使用std::vector<node*>
将默认初始化值初始化数组。循环中的性能优势最小,因为它完成相同的工作。但是,如果因此导致性能下降,那么您必须查看代码/算法中的其他位置,以确定是否有任何内容可以移动到不那么热门的代码路径。
如果您必须使用动态数组,请在编译时知道std::array<node*,N>
时使用N
或using 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;
});