C++ 我应该在哪里分配内存? for(int i=0;i

C++ 我应该在哪里分配内存? for(int i=0;i,c++,performance,memory-management,C++,Performance,Memory Management,现在,pLine在循环中声明,因为它只在循环体中使用。但是,在循环外只分配一次不会减少执行的分配量(避免内存碎片) std::unique_ptr pLine(新字节[lineSize]); 对于(int i=0;i

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

std::unique_ptr pLine(新字节[lineSize]);
对于(int i=0;i
我可以相信,如果编译器知道在整个迭代过程中线条大小保持不变,它将能够轻松地优化第一个版本;但它在函数调用过程中会发生变化,所以我不能将其设为常量


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

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

std::unique_ptr<BYTE[]> pLine( new BYTE[lineSize] );
for( int i = 0; i < lines; i++ ) {
    //Do stuff
}
std::矢量数据(计数)//分配和初始化
它分配内存并初始化所有元素。如果希望它只分配,而不进行任何初始化,请编写以下代码:

std::vector<BYTE>  data(count); //allocate and initialize
std::矢量数据;
数据.储备(计数)//仅分配

现在,你应该在哪里申报?这取决于它的用途。但是试着缩小变量的范围:如果它只在
for
循环中需要,那么就在循环本身内部声明它。

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

std::unique_ptr<BYTE[]> pLine( new BYTE[lineSize] );
for( int i = 0; i < lines; i++ ) {
    //Do stuff
}
std::矢量数据(计数)//分配和初始化
它分配内存并初始化所有元素。如果希望它只分配,而不进行任何初始化,请编写以下代码:

std::vector<BYTE>  data(count); //allocate and initialize
std::矢量数据;
数据.储备(计数)//仅分配
现在,你应该在哪里申报?这取决于它的用途。但是尽量缩小变量的范围:如果只在
for
循环中需要它,那么在循环本身中声明它

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

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

微优化使代码更快/内存效率更高,但代价是清晰度。这不符合那种描述

另一个不相关的注意事项是,您确实想要指向
字节[]
的指针吗?看起来很奇怪

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

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

微优化使代码更快/内存效率更高,但代价是清晰度。这不符合那种描述


另一个不相关的注意事项是,您确实想要指向
字节[]
的指针吗?似乎有点奇怪…

问题是
//做些什么

std::vector<BYTE>  data;
data.reserve(count); //allocate only
循环的第一次所有权被转移,现在
pLine
包含一个空指针,用于后续迭代的第二次

如果您没有转移所有权,那么您可能使用了完全错误的内存管理方法,向量可能是一个更好的主意

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

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

问题是
//Do Stuff

std::vector<BYTE>  data;
data.reserve(count); //allocate only
循环的第一次所有权被转移,现在
pLine
包含一个空指针,用于后续迭代的第二次

如果您没有转移所有权,那么您可能使用了完全错误的内存管理方法,向量可能是一个更好的主意

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

将其放入循环中的好处是它会被重新初始化,以便在循环的每次迭代中所有成员都为零。如果
//Do Stuff
受到
pLine
状态的影响,则将其移出循环可能是不正确的(无需做更多工作来确保每次迭代后
pLine
的状态正确。

如果
lineSize
的值在整个循环中发生变化,您将如何仅在外部分配一次
pLine
(除非您知道最大行的大小)?@FrédéricHamidi:我猜他的意思是,它指向的是变化,而不是指针本身(可能是错误的)。它在整个循环中不会变化;它在函数调用中变化(这是在函数内部)。对于每个函数调用,它保持不变。如果
lineSize
的值在整个循环中发生变化,您将如何仅在外部分配
pLine
一次(除非您知道最大行的大小)?@FrédéricHamidi:我猜他的意思是它指向的内容发生了变化,而不是指针本身(可能是错误的)。它不会在整个循环中更改;它会在函数调用中更改(这是函数内部)。对于每个函数调用,它都是一样的。我想它没有什么不同。在某些情况下,指针甚至比向量更好,因为向量需要太多的开销。@Forgottn:vector需要太多的开销?有证据吗?@Forgottn:“检查东西”?已检查我