WCHAR bitmapPathBuffer[512]
堆栈分配是否可行?还是对于这个大小最好使用堆内存?何时更好地从堆栈转换为堆的合理指示大小是多少......所有人都说"这取决于",但我们的大脑需要一些限制或方向。
WCHAR bitmapPathBuffer[512]
堆栈分配是否可行?还是对于这个大小最好使用堆内存?何时更好地从堆栈转换为堆的合理指示大小是多少......所有人都说"这取决于",但我们的大脑需要一些限制或方向。
platform default size # bits # digits
===============================================================
SunOS/Solaris 8172K bytes <=39875 <=12003 (Shared Version)
Linux 8172K bytes <=62407 <=18786
Windows 1024K bytes <=10581 <=3185 (Release Version)
cygwin 2048K bytes <=3630 <=1092
ulimit -s
的脚本中。 - James Kanze作为一般规则,我同意其他回答者在桌面系统上,16-64KB左右是合理的限制,但这还取决于递归深度等因素。肯定的是,大型堆栈帧是代码异味,应该进行调查以确保它们是必要的。
特别是,考虑任何分配在堆栈上的缓冲区的长度...它们是否真的足够大来容纳任何可能的输入?你是否在运行时检查避免溢出?例如,在你的例子中,你是否确信 bitmapPathBuffer
的长度永远不会超过512个WCHAR
?如果你不确定最大长度一定,那么堆可能更好。即使如此,在对抗性环境中,你可能要对其设置一个较大的上限,以避免涉及内存耗尽的攻击。
std::vector
进行动态分配,并使用正确的选项进行编译,缓冲区溢出将导致程序崩溃并显示可识别的错误。如果你使用本地分配,缓冲区溢出可能会改变函数的返回地址,从而导致执行不良代码。 - James Kanze答案是“这要看情况”。
如果您定义了许多这样的变量,或者在您的函数及其调用的函数中进行相对较大的堆栈分配,则可能会发生堆栈溢出。
Win32可执行文件的典型默认堆栈大小为1MB。如果您分配的内存超过此限制,那么您可能会遇到问题,应该将最大的分配更改为堆上的分配。
我会遵循一个简单的规则-如果您的分配超过16-64KB,那么请在堆上分配。否则,在堆栈上分配应该是可以的。
没有硬性限制,但您可能需要考虑分配失败的情况。如果本地变量的分配失败,则程序会崩溃;如果动态变量的分配失败,则会收到(或应该收到)异常。因此,我倾向于对大约1K以上的任何内容使用动态分配(以std::vector
的形式)。另外,std::vector
在编译时没有优化时进行边界检查(至少是我使用的实现),这也是一个优点。
ulimit -a
命令获取您的限制,如果您正在使用 Linux。 - mch