O uso de strings é uma das operações mais elementares em qualquer aplicação Delphi. No entanto, a forma como manipulamos esses dados pode ser a diferença entre um sistema fluido e um que sofre com latência excessiva e fragmentação de memória.
Neste artigo, vamos descer ao nível dos bits para entender o comportamento do gerenciador de memória do Delphi e estabelecer critérios técnicos sobre quando utilizar a concatenação tradicional e quando migrar para o TStringBuilder.
O Funcionamento das Strings e o Custo do Gerenciamento de Memória
Para entender a diferença, precisamos lembrar que as strings no Delphi (UnicodeString) são tipos de referência com contagem de referências, mas com uma característica crucial: elas são logicamente imutáveis quando sofrem alteração de tamanho.
Ao concatenar duas strings usando o operador +, o Delphi não apenas “pendura” o novo texto ao final do antigo. O processo envolve:
- Localização de Espaço: O Memory Manager (FastMM) precisa encontrar um bloco contíguo de memória que comporte a soma das duas strings.
- Alocação: Um novo bloco de memória é alocado na Heap.
- Cópia: O conteúdo da primeira e da segunda string é copiado para o novo endereço.
- Liberação: A string antiga é liberada (ou sua contagem de referência é decrementada).
Em loops de milhares de iterações, esse ciclo de “aloca-copia-libera” gera uma pressão enorme no gerenciador de memória, resultando em fragmentação de memória (Heap Fragmentation). Em sistemas long-running (como servidores), isso pode levar ao erro EOutOfMemory mesmo com RAM disponível, simplesmente por não haver um bloco contíguo grande o suficiente.
TStringBuilder: A Estratégia de Bufferização
O TStringBuilder (unit System.SysUtils) aborda o problema de forma distinta. Em vez de criar uma nova string a cada modificação, ele reserva um buffer interno mutável.
A grande vantagem reside na propriedade Capacity. Se você prevê que o resultado final terá 1MB, você pode inicializar o objeto já com essa reserva:
SB := TStringBuilder.Create(1024 * 1024); // Reserva 1MB de imediato
Isso reduz o número de realocações de para uma única alocação, eliminando o custo computacional de cópias sucessivas.
Análise de Complexidade Algorítmica (Big O)
A diferença de performance é explicada matematicamente pela Notação Big O:
- Operador
+: Em um loop, a cada iteração , você copia todos os caracteres acumulados. A carga de trabalho cresce de forma quadrática conforme o número de concatenações aumenta. - TStringBuilder : Como as inserções ocorrem em um buffer pré-existente (com expansões geométricas ocasionais), o custo médio de cada adição é constante, resultando em uma complexidade linear.
Comparativo Técnico: Prós e Contras
| Critério | Concatenação Comum (+) | TStringBuilder |
| Tipo de Dado | Valor (Referência gerenciada) | Objeto (Classe na Heap) |
| Mutabilidade | Imutável (Gera nova cópia) | Mutável (Buffer interno) |
| Custo de Instalação | Zero (Nativo do compilador) | Elevado (Criação de objeto) |
| Gerenciamento | Automático (ARC) | Manual (Try..Finally) |
| Thread-Safety | Seguro (Copy-on-Write) | Não-seguro (Requer sincronia) |
| Ideal para… | Pequenas junções e UI simples | Loops, JSON, XML e SQL extensos |
Quando usar cada abordagem?
O Cenário do Operador +
Não existe “bala de prata”. O TStringBuilder é uma classe, e instanciar um objeto envolve alocação na Heap, inicialização da VMT (Virtual Method Table) e gerenciamento de ciclo de vida. Para concatenar 3 ou 4 strings curtas, o overhead de criar o objeto é maior do que o benefício da performance. Use + quando a legibilidade for prioridade e o volume de dados for baixo.
O Cenário do TStringBuilder
A vantagem real começa a aparecer após a décima concatenação consecutiva ou quando o volume de dados ultrapassa alguns kilobytes. É indispensável em:
- Construção de comandos SQL complexos via código.
- Serialização manual de JSON ou XML.
- Processamento de arquivos de texto linha a linha.
Conclusão
A regra de ouro da engenharia de software no Delphi é: utilize o operador + para o cotidiano e a interface do usuário, mas mude para o TStringBuilder assim que identificar um loop ou processamento de dados volumosos. Conhecer o que acontece nos bastidores da memória é o que separa um código funcional de um código de alta performance.
Referênciass
CANTÙ, Marco. Object Pascal Handbook. 1. ed. Piacenza: CreateSpace Independent Publishing Platform, 2015.
EMBARCADERO. Internal Data Formats (Delphi): UnicodeString. Disponível em: https://docwiki.embarcadero.com/RADStudio/en/Internal_Data_Formats_(Delphi)#UnicodeString_Types. Acesso em: 30 abr. 2026.
EMBARCADERO. System.SysUtils.TStringBuilder. Disponível em: https://docwiki.embarcadero.com/Libraries/en/System.SysUtils.TStringBuilder. Acesso em: 30 abr. 2026.
THORPE, Danny. Delphi Component Design. Indianapolis: New Riders, 1996. (Fundamentos de gerenciamento de memória em Object Pascal).
Descubra mais sobre Régys Borges da Silveira
Assine para receber nossas notícias mais recentes por e-mail.
Dê-nos sua opinião, seu comentário ajuda o site a crescer e melhorar a qualidade dos artigos.