Strings

Data: 2009-07-07
Categorias: C++, Programação

Como já vimos centenas e centenas de vezes, memória é apenas memória até que alguém diga que isso vale alguma coisa. Em seu estado latente é o que chamamos formalmente de dados. E dados são bytes armazenados na memória.

No entanto, quando esses dados viram algo de útil em um determinado contexto, não necessariamente alterando-se seu conteúdo na memória, passamos a lidar com informação. Ou seja, é um dado com significado. E informação é a interpretação desses mesmos dados.

A conclusão óbvia para isso, falando de strings, é: uma série de bytes enfileirados na memória pode ser uma string.

Para tanto precisamos apenas de dados (os bytes enfileirados) e significado (uma tabela de símbolos que traduza esses bytes para caracteres e a definição de como a string se organiza).

Por exemplo, uma série de bytes diferentes de zero com valores que representam índices de uma tabela de tradução de caracteres e que termina sua sequência em um byte com o valor zero nele é considerada uma string C, ou string terminada em nulo.

String C

Já uma mesma sequência de bytes no mesmo molde só que sem o byte final com o valor zero, mas com um byte inicial que tem como valor não um índice de caractere, mas o número de bytes subsequentes, isso é uma string Pascal, ou uma string com contador de tamanho.

String Pascal

Agora note por que tanto uma string vazia em Pascal e em C possuem os mesmos dados, mas informação diferente.

Outras strings que não necessariamente possuem terminador nulo: std::string, UNICODE_STRING, strings no kernel.

4 respostas para “Strings”

  1. Fernando Roberto Diz:

    Muito legal Lesma!

    Cagamba! Eu já tinha programado Pascal no final do século passado e nem imaginava que era assim. Na verdade acho eu não imaginava nada. Eram apenas palavras no computador. :-)
    Com estas figuras até minha tia consegue entender.
    Pena que esse tipo de arte nos tome um tempo considerável, já que nosso forte é editor de arquivo texto. Vou colocar na minha lista de tarefas para o ano que vêm: "Tirar certificação de Paint Brush".

    Obrigado pela ajuda com meu post.
    []s.

  2. Wanderley Caloni Diz:

    Ae, manu. É nóis nos bytes =)

    []s

  3. ViniGodoy Diz:

    Uma coisa interessante de se notar é o impacto que uma implementação dessas pode ocasionar. Pegue o exemplo clássico da string C pura. Calcular o tamanho de uma string dessas exige que você percorra toda cadeia de caracteres em busca do , o que no pascal é uma operação instantânea.

    Agora, considere que praticamente todo tipo de operação, como a cópia de strings, dependerá desse tamanho (a cópia em si não depende, mas para alocar memória para onde os dados serão copiados, vc provavelmente precisará).

    Não é à toa, que observou-se que a implementação do std::string acaba sendo mais eficiente do que as strings planas do C, na maior parte dos casos.

    Entretanto, a menos que você queira strings de no máximo 255 caracteres, irá usar um indexador maior do que 1 único byte. No caso das versões recentes do object pascal, são 4 bytes, o que representa um consumo 3 bytes maior do que a versão do C por string. Isso dificilmente é um problema hoje em dia, mesmo se levar em consideração a programação de boa parte dos hardwares.

  4. Wanderley Caloni Diz:

    Exatamente. Como já diria Joel.

    []s

Deixe uma resposta