Todo depende de la plataforma y la representación.
Por ejemplo, en .NET una cadena toma dos bytes en la memoria por punto de código UTF-16. Sin embargo, los pares suplentes requieren dos valores UTF-16 para un carácter Unicode completo en el rango de U + 100000 a U + 10FFFF. El formulario en memoria también tiene una sobrecarga para la longitud de la cadena y posiblemente algo de relleno, así como la sobrecarga de objetos normales de un puntero de tipo, etc.
Ahora, cuando escribe una cadena en el disco (o red, etc.) desde .NET, usted especifica la codificación (con la mayoría de las clases predeterminadas a UTF-8). En ese punto, el tamaño depende mucho de la codificación. ASCII siempre toma un solo byte por carácter, pero es muy limitado (sin acentos, etc.); UTF-8 proporciona el rango Unicode completo con una codificación variable (todos los caracteres ASCII se representan en un solo byte, pero otros ocupan más). UTF-32 siempre usa exactamente 4 bytes para cualquier carácter Unicode; la lista continúa.
Como puede ver, no es un tema simple. Para calcular cuánto espacio va a ocupar una cadena, deberá especificar exactamente cuál es la situación, si se trata de un objeto en la memoria en alguna plataforma (y si es así, qué plataforma), posiblemente incluso hasta la implementación y la configuración del sistema operativo), o si se trata de un formulario en bruto codificado, como un archivo de texto, y si es así, con qué codificación.
En Delphi shortstring tiene un byte extra, pero otros tipos de cadena tienen cuatro bytes adicionales. – inzKulozik
Lo sé, pero las cadenas cortas se llaman cadenas pascales ;-). –
Muy buena respuesta, corta y dulce, directa al grano, e incluye los ejemplos más comunes del mundo real. –