Быстрое предисловие. Мне очень удобно в .Net, но у меня ограниченный опыт работы на C++, поэтому я не уверен, что я делаю это хорошо. Я использую объект сопоставления файлов, чтобы получить то, что потенциально может быть относительно длинной строкой, состоящей из нескольких тысяч имен файлов. Эта функция может быть вызвана с помощью ImageOverlayHandler, подключенного к проводнику Windows, так что потребление скорости и памяти вызывает беспокойство. Этот код потенциально может быть вызван сотнями запросов оверлей одновременно (но только в случаях краев). В приведенном ниже коде это эффективный способ сделать это? Используя этот подход, если я правильно понял свой код, я не буду создавать локальную копию сопоставленного файла, а boost :: contains call должен быть довольно быстрым. Любые мысли о том, как я могу это улучшить, или как я должен делать это по-другому? в предыдущей итерации я использовал векторы и т. д., но похоже, что она будет использовать гораздо больше памяти.Поиск большой строки C++ из сопоставления файлов быстро и эффективно
HRESULT GetFolders()
{
HANDLE hMapFile;
LPCWSTR pBuf;
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
szFolderName); // name of mapping object
if (hMapFile == NULL)
{
return NULL;
}
pBuf = (LPCWSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
CloseHandle(hMapFile);
return NULL;
}
wstring resOut = (wstring)pBuf;
bool val = boost::contains(resOut, L"C:\\FOLDER1");
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
}
Что вы на самом деле пытаетесь сделать? Вы действительно просто проверяете, содержит ли ваша огромная строка «C: \ FOLDER1»? Если да, не было бы легче проверить это в другом коде и просто передать bool на код C++? – arx
Поскольку вы не определяете BUF_SIZE в своем коде, неясно, будет ли это работать. Он может работать во время тестирования и сбой, если ваша строка поиска находится за пределами конца буфера. Также создание 'wstring' делает копию, удваивая ваши требования к памяти. –
А, так это создание дубликата? Это не идеально. Могу ли я просто передать метод повышения LPCWSTR, чтобы избежать этого? Размер buf установлен в 0, который должен отображать весь файл вправо? –