我对为我的变量分配内存有点困惑。例如,如果我正在创建一个大型数据结构(数组、结构、对象等),并且在 main() 的范围内对其进行初始化,我是否应该创建一个局部变量
int chessBoard[8][8] = ...
还是我应该在堆上分配内存?
int * chessBoard = new array[8][8];
*chessBoard = ...
有关系吗?是优惠吗?一种更高效/更智能?我个人喜欢为较大的对象分配内存,我觉得对于堆栈帧来说不够小。但我真的不知道。
我对为我的变量分配内存有点困惑。例如,如果我正在创建一个大型数据结构(数组、结构、对象等),并且在 main() 的范围内对其进行初始化,我是否应该创建一个局部变量
int chessBoard[8][8] = ...
还是我应该在堆上分配内存?
int * chessBoard = new array[8][8];
*chessBoard = ...
有关系吗?是优惠吗?一种更高效/更智能?我个人喜欢为较大的对象分配内存,我觉得对于堆栈帧来说不够小。但我真的不知道。
当需要大量传递对象所有权时,通常最好使用 malloc 分配内存。如果对象要在单个引用块中使用并且不会超出范围,那么局部变量肯定更好。这一切都归结为“循环完成后你是否需要坚持下去”。
如果您暗示它在 main() 中定义,那么它肯定会永远有效(直到应用程序关闭),在这种情况下,它更多地取决于个人喜好。许多人更喜欢局部变量,因为它们更容易阅读,并且取消引用看起来不那么混乱。
您应该考虑分配的对象的大小,因为代码如下:
int something[10000000];
会导致内存错误,但是:
int *something = new int[10000000];
会正常工作。
使用 malloc 分配的动态内存的主要原因是当您不知道编译时所需的最大内存量时。对于棋盘,大小始终为 8 x 8,数组很好。在大多数计算机上,八乘八的 int 数组很小。
对于名称列表,您很少知道可能遇到的最大数量,因此请使用 malloc。
数组要快一点,因为编译器会保留空间。使用 malloc,可以在运行时调用库函数来请求内存。一旦你有记忆,任何一种方式通常都是相同的速度。
使用指针访问 malloc 分配的内存比简单地使用数组要复杂一些。但是,如果您要成为 C 程序员,则应该了解两者。
对于非常大量的内存,您必须使用 malloc。
The biggest mistake made with memory allocated by malloc is forgetting to free it when you are done with it. If you forget to free it, you can have a memory leak.