maneira portátil para detectar fragmentação da heap em C ++ em tempo de execução?
-
12-09-2019 - |
Pergunta
Eu estou escrevendo um aplicativo baseado em qt c ++ e eu preciso ser capaz de detectar a fragmentação de memória, a fim de verificar se o sistema atual pode realmente sustentar a carga de memória: a carga programa de uma imagem grande (15/21 megapixels são a norma) na memória e, em seguida, executar alguma filtragem sobre ele (w / escassa matrizes). Por exemplo, eu estou tendo problema de fragmentação de memória no Windows e VMMap tem sido muito útil para isso: o problema era algumas DLLs (Wacom tablet "wintab32.dll" eo app UltraMon) não se realocados assim que está dividindo o espaço de endereço no 0x10000000-0x30000000 VA do processo.
Eu quero fornecer o aplicativo com algum tipo de consciência para o problema de fragmentação e se perguntando se uma abordagem multi-plataforma (linux / mac / win32) dando as informações VMMap já dá existe.
Solução
Resposta curta: Não há nenhuma maneira portátil.
resposta mais longa: Como a pilha é implementada e como ele funciona é um detalhe de implementação de sua implementação que amplamente difere entre as plataformas, std bibliotecas e sistemas operacionais. Você terá que criar uma versão diferente para cada aplicação - desde que, a implementação lhe dá uma API para ligar para ele. (Que Eu acho deve ser o caso para as três plataformas que você alvo.)
Outras dicas
Eu acho que você é excessivamente pessimista. 21 MP, mesmo admitindo um colorDepth de 16 bits e uma alphachannel igual em tamanho que levar apenas 168 MB. O espaço de endereço disponível em um sistema de 32 bits é medido em gigabytes.
Será que isso não o que você precisa?
bool is_contiguous_freestore_available(size_t max)
{
char* tst = new(std::nothrow) char[max];
if (tst == null)
return false;
delete[] tst;
return true;
}