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在整个迭代过程中保持不变;但它在整个函数调用中确实发生了变化,因此我无法将其变为常量。
我还认为应该避免这样的微优化,直到检测到性能问题,所以我想我会坚持使用第一个版本。你们觉得怎么样?
答案 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 Stuff
受pLine
状态的影响,那么将其移出循环可能是不正确的(没有做更多工作以确保pLine
的状态是正确的每次迭代后。
答案 2 :(得分:0)
我还认为应该避免这样的微优化,直到检测到性能问题为止
这不是“微观优化”,它确实是常识。即使编译器可以将变量提升到循环之外(你是否检查它是否存在?),为什么要问它是否需要?
微观优化使您的代码更快/更节省内存,但代价是清晰度。这不符合该描述。
在一个不相关的说明中,你确定你真的想要一个指向BYTE[]
的指针吗?看起来很奇怪......