AllocMem
Caros colegas, por exemplo:
Num outro ponto do programa, eu precisaria saber quanto de memória foi alocada para p.
Existe alguma instrução que me dê essa informação ?
var p:Pchar; begin p := AllocMem(512); end;
Num outro ponto do programa, eu precisaria saber quanto de memória foi alocada para p.
Existe alguma instrução que me dê essa informação ?
Persist
Curtidas 0
Respostas
Beppe
29/07/2004
Esta informação fica no cabeçalho do bloco.
TamAloc := (PInteger(Integer(P) - 4)^ and not 3)
Lembre-se de checar por nil.
Como o alocador de memória do Delphi aloca blocos de tamanhos multiplo de 4, vc naum saberá exatamente o quanto foi pedido na alocação. Como alternativa, vc pode usar as rotinas StrAlloc e StrSize.
TamAloc := (PInteger(Integer(P) - 4)^ and not 3)
Lembre-se de checar por nil.
Como o alocador de memória do Delphi aloca blocos de tamanhos multiplo de 4, vc naum saberá exatamente o quanto foi pedido na alocação. Como alternativa, vc pode usar as rotinas StrAlloc e StrSize.
GOSTEI 0
Persist
29/07/2004
Seria o mesmo que:
Move((p-4)^, TamAloc, 4); :?:
Move((p-4)^, TamAloc, 4); :?:
GOSTEI 0
Beppe
29/07/2004
Seria o mesmo que:
A MM do Delphi usa os dois bits menos significativos docampo tamanho pra administração do bloco, por isso o bitwise and not.
Move((p-4)^, TamAloc, 4); TamAloc := TamAloc and not 3;
A MM do Delphi usa os dois bits menos significativos docampo tamanho pra administração do bloco, por isso o bitwise and not.
GOSTEI 0
Persist
29/07/2004
Valeu pela ajuda do cabeçalho Beppe.
Na verdade ele aloca o próximo maior múltiplo de 4 e mais 4.
Por ex:
511 - aloca 512 + 4 = 516.
999 - aloca 1000 + 4 = 1004.
Para mim não serve pq tenho que ler o buffer exato do que foi alocado, então vou alocar mais 4 bytes e colocar no início o tamanho do que virá a seguir.
Muito obrigado !!!
Aproveitando o assunto, vc saberia como o Delphi irá ficar com esses novos chips de 64 bits ?
Creio que o endereçamento irá mudar radicalmente.
Na verdade ele aloca o próximo maior múltiplo de 4 e mais 4.
Por ex:
511 - aloca 512 + 4 = 516.
999 - aloca 1000 + 4 = 1004.
Para mim não serve pq tenho que ler o buffer exato do que foi alocado, então vou alocar mais 4 bytes e colocar no início o tamanho do que virá a seguir.
Muito obrigado !!!
Aproveitando o assunto, vc saberia como o Delphi irá ficar com esses novos chips de 64 bits ?
Creio que o endereçamento irá mudar radicalmente.
GOSTEI 0
Beppe
29/07/2004
É sim, ele aloca mais 4 para armazenar os bits que falei, esqueci de contar junto. O cálculo é Largura + 7 and not 3.
Como eu disse antes, as rotinas StrAlloc e StrSize fazem isso que vc pretende fazer.
Sobre como vai ficar no Itanium e AMD-64, se o Delphi ficar, não vai ficar logo não.
No Delphi.NET, ele já roda perfeitamente se utilizar só de código gerenciado...o tamanho dos ponteiros é transparente.
Se e quando a Borland produzir uma versão nativa do Delphi para 64 bits, aí tem uma porção de detalhes, detalhes estes que nem tenho total conhecimento ainda. Isso porque um tamanho de palavra de 64 bits, implica num espaço de endereçamento de 64 bits também(sem artifícios).
Talvez para as aplicações legado, a nível de usuário, funcionará ainda endereços de 32 bits, dado que o endereçamento lógico para o usuário permaneça como o(ou seja um superset do) atual. Para novas aplicações haverá um tipo nativo para os novos endereçamentos.
Mas acho que ainda é cedo para se pensar nisso seriamente.
Como eu disse antes, as rotinas StrAlloc e StrSize fazem isso que vc pretende fazer.
Sobre como vai ficar no Itanium e AMD-64, se o Delphi ficar, não vai ficar logo não.
No Delphi.NET, ele já roda perfeitamente se utilizar só de código gerenciado...o tamanho dos ponteiros é transparente.
Se e quando a Borland produzir uma versão nativa do Delphi para 64 bits, aí tem uma porção de detalhes, detalhes estes que nem tenho total conhecimento ainda. Isso porque um tamanho de palavra de 64 bits, implica num espaço de endereçamento de 64 bits também(sem artifícios).
Talvez para as aplicações legado, a nível de usuário, funcionará ainda endereços de 32 bits, dado que o endereçamento lógico para o usuário permaneça como o(ou seja um superset do) atual. Para novas aplicações haverá um tipo nativo para os novos endereçamentos.
Mas acho que ainda é cedo para se pensar nisso seriamente.
GOSTEI 0