我应该在哪里分配这个内存?

时间:2012-06-08 17:16:36

标签: c++ performance memory-management

for( int i = 0; i < lines; i++ ) {
    std::unique_ptr<BYTE[]> pLine( new BYTE[lineSize] );
    //Do stuff
}

现在,pLine在循环内声明,因为它仅在循环体中使用。但是,在循环外只分配一次会减少执行的分配量(避免内存碎片)吗?

std::unique_ptr<BYTE[]> pLine( new BYTE[lineSize] );
for( int i = 0; i < lines; i++ ) {
    //Do stuff
}

我相信编译器能够轻松优化第一个版本,如果它知道lineSize在整个迭代过程中保持不变;但它在整个函数调用中确实发生了变化,因此我无法将其变为常量。

我还认为应该避免这样的微优化,直到检测到性能问题,所以我想我会坚持使用第一个版本。你们觉得怎么样?

3 个答案:

答案 0 :(得分:3)

首先,我认为你正在使用错误的工具。您应该使用std::vector作为:

std::vector<BYTE>  data(count); //allocate and initialize

它分配内存并初始化所有元素。如果你想要它只分配,没有任何初始化,那么写下这个:

std::vector<BYTE>  data;
data.reserve(count); //allocate only

现在,您应该在哪里声明这个?这取决于它的用途。但是尝试减少变量的范围:如果仅在for循环中需要它,那么在循环内部声明它。

答案 1 :(得分:2)

问题实际上是//do Stuff

中的内容
for( int i = 0; i < lines; i++ ) {
    std::unique_ptr<BYTE[]> pLine( new BYTE[lineSize] );
    //Do stuff
}

我认为你将循环中的内存分配给unique_ptr,因为在//Do stuff部分的某个地方你将该内存的所有权传递给另一个对象。

如果您尝试这样做:

std::unique_ptr<BYTE[]> pLine( new BYTE[lineSize] );
for( int i = 0; i < lines; i++ ) {
    //Do stuff
}

第一次围绕循环所有权转移,现在pLine包含一个NULL指针,用于后续迭代的第二次。

如果您没有转让所有权,那么您可能正在使用完全错误的方法进行内存管理,而向量可能是一个更好的主意。

for( int i = 0; i < lines; i++ ) {
    std::vector<BYTE> pLine(lineSize);
    //Do stuff
}

将它放入循环中的优点是重新初始化,因此所有成员在循环的每次迭代中都为零。如果//Do StuffpLine状态的影响,那么将其移出循环可能是不正确的(没有做更多工作以确保pLine的状态是正确的每次迭代后。

答案 2 :(得分:0)

  

我还认为应该避免这样的微优化,直到检测到性能问题为止

这不是“微观优化”,它确实是常识。即使编译器可以将变量提升到循环之外(你是否检查它是否存在?),为什么要问它是否需要?

微观优化使您的代码更快/更节省内存,但代价是清晰度。这不符合该描述。

在一个不相关的说明中,你确定你真的想要一个指向BYTE[]的指针吗?看起来很奇怪......