Есть ли способ, чтобы буферные функции не тратили столько памяти? - PullRequest
3 голосов
/ 18 апреля 2011

Буферные функции, такие как GetWindowText (), GetModuleFileName (), SHGetFolderPath (), меня бесят, потому что вы почти всегда тратите так много памяти в буфере.Есть ли способ, чтобы они не тратили столько памяти?

Ответы [ 3 ]

4 голосов
/ 18 апреля 2011

Обычно вы вызываете эти функции с буфером, который был выделен в стеке.Практически нет затрат на выделение достаточного пространства в стеке, потому что он становится неиспользованным, как только вы возвращаетесь из своей функции.

Если вы попытаетесь сделать что-то, что выделяет столько памяти, сколько требуется (например, вызов GetWindowText() несколько раз с увеличением размера буфера), вы будете тратить время вместо памяти.Время (и, следовательно, энергия) намного дороже.

4 голосов
/ 18 апреля 2011

"разозлить меня"? Вам шесть лет? : -)

Я не совсем уверен, что ваша жалоба здесь. Вы можете довольно легко ограничить сумму, возвращаемую из GetWindowText и GetModuleFileName (за счет потери информации), указав свою максимальную длину.

Но, если вы хотите получить все это, вам нужно место для этого. Там нет никакого способа обойти это. SHGetFolderPath не так уж и гостеприимен, но, в конце концов, это всего лишь MAXPATH символов.

Мне трудно поверить, что кто-то под Windows обеспокоен очень маленьким распределением, необходимым для хранения этих элементов данных. Вы знаете, что у вас есть абсолютная загрузка адресного пространства, да? И вы можете поделиться памятью, используя ее для более чем одной цели (хотя, конечно, не одновременно), если вы действительно обеспокоены.

1 голос
/ 18 апреля 2011

Существуют разные решения для разных функций. Например, вызову GetWindowText () может предшествовать вызов GetWindowTextLength (). С GetModuleFileName () вы можете передать небольшой буфер и посмотреть, подходит ли имя файла. Существуют и другие функции, в которых, если вы передадите null для вашего буфера, они вернут точный размер, который вам нужно выделить для вашего буфера при следующем вызове функции.

В общем, вы делаете большое дело из маленькой проблемы. Память очень дешевая в наши дни, и я был бы очень удивлен, если, например, имя файла приводит к исчерпанию памяти. Просто выделите 32-килобайтный буфер (максимальная длина пути NTFS) и покончите с этим.

...