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.
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.
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.



July 7th, 2009 at 4:00 pm
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.
July 7th, 2009 at 4:37 pm
Ae, manu. É nóis nos bytes =)
[]s
July 20th, 2009 at 1:32 pm
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.
July 21st, 2009 at 10:53 am
Exatamente. Como já diria Joel.
[]s