0
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 在整个迭代过程中保持不变,我可以相信编译器能够轻松优化第一个版本;但它确实会在整个函数调用中发生变化,所以我不能让它成为一个常数。

我还认为在检测到性能问题之前应该避免像这样的微优化,所以我想我会坚持使用第一个版本。你们有什么感想?

4

3 回答 3

3

首先,我认为您为此使用了错误的工具。你应该使用的是std::vector

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

它分配内存并初始化所有元素。如果您希望它只分配而不进行任何初始化,请编写以下代码:

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

现在,你应该在哪里声明?这取决于它的用途。但尽量缩小变量的范围:如果只在for循环中需要它,则在循环本身中声明它。

于 2012-06-08T17:20:52.857 回答
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每次迭代后的状态正确。

于 2012-06-08T17:58:25.947 回答
0

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

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

微优化以清晰为代价使您的代码更快/内存效率更高。这不符合那个描述。

在不相关的注释上,您确定您真的想要一个指向 a 的指针BYTE[]吗?好像很奇怪...

于 2012-06-08T17:21:05.403 回答