缓冲函数如GetWindowText(),GetModuleFileName(),SHGetFolderPath()让我生气,因为你几乎总是在缓冲区中浪费这么多内存。有没有办法让他们不浪费那么多记忆?
答案 0 :(得分:4)
我不完全确定你的抱怨在这里。您可以通过指定自己的最大长度,轻松限制从GetWindowText
和GetModuleFileName
返回的内容(以丢失信息为代价)。
但是,如果你想要得到整个东西,你需要空间。没有办法解决这个问题。 SHGetFolderPath
不是那么容易,但毕竟只有MAXPATH
个字符。
我发现很难相信Windows下的某个人担心存储这些数据项所需的非常小的分配。你知道你有足够的地址空间,是吗?如果你真的很担心,你可以分享记忆,重复使用它(当然不是同时发生)。
答案 1 :(得分:4)
通常,您将使用已在堆栈上分配的缓冲区调用这些函数。在堆栈上分配足够的空间几乎没有成本,因为它从你的函数返回时就不会被使用了。
如果您尝试执行仅分配所需内存的内容(例如,使用增加的缓冲区大小重复调用GetWindowText()
),则会浪费时间而不是内存。时间(因此能量)成本更高。
答案 2 :(得分:1)
针对不同的功能有不同的解决方案。例如,调用GetWindowText()之前可以调用GetWindowTextLength()。使用GetModuleFileName(),您可以传递一个小缓冲区,并查看文件名是否适合。还有其他一些函数,如果你为缓冲区传递一个null,它们将在你下次调用函数时返回你需要为缓冲区分配的确切大小。
但总的来说,你在一个小问题上做了大量工作。这些天内存很便宜,如果一个文件名导致你耗尽内存,我会感到非常惊讶。只需分配一个32k缓冲区(最大NTFS路径长度)并完成它。