Estoy escribiendo un intérprete de lenguaje de C, y mi tipo string
contiene un atributo length
, así:¿Por qué cadenas terminadas en nulo? O: terminada en nulo vs almacenamiento de caracteres + longitud
struct String
{
char* characters;
size_t length;
};
Debido a esto, tengo que pasar Mucho tiempo en mi intérprete maneja este tipo de cadena de forma manual ya que C no incluye soporte integrado para ella. He considerado cambiar a cadenas simples terminadas en nulo solo para cumplir con la C subyacente, pero parece que hay muchas razones para no:
La verificación de límites está incorporada si usa "longitud" en lugar de buscando un nulo.
Tiene que recorrer toda la cadena para encontrar su longitud.
Tiene que hacer cosas adicionales para manejar un carácter nulo en el medio de una cadena terminada en nulo.
Las cadenas terminadas en nulo no funcionan bien con Unicode.
Las cadenas no terminadas en nulo pueden internar más, es decir, los caracteres para "Hola, mundo" y "Hola" se pueden almacenar en el mismo lugar, solo con diferentes longitudes. Esto no se puede hacer con cadenas terminadas en nulo.
Segmento de cadena (nota: las cadenas son inmutables en mi idioma). Obviamente, el segundo es más lento (y más propenso a errores: piense en agregar la verificación de errores de begin
y end
a ambas funciones). Estoy pensando acerca de por qué los utiliza C:
struct String slice(struct String in, size_t begin, size_t end)
{
struct String out;
out.characters = in.characters + begin;
out.length = end - begin;
return out;
}
char* slice(char* in, size_t begin, size_t end)
{
char* out = malloc(end - begin + 1);
for(int i = 0; i < end - begin; i++)
out[i] = in[i + begin];
out[end - begin] = '\0';
return out;
}
Después de todo esto, mi pensamiento ya no es sobre si debería utilizar cadenas terminadas en cero, es decir!
Entonces mi pregunta es: ¿hay algún beneficio para la terminación nula que me falta?
Dado que malloc() es muy caro en C, sugiero usar esta estructura: struct String {size_t length; caracteres de char [1]; } Simplemente asigne strlen (s) + 1 + sizeof (size_t) o strlen (s) + sizeof (String) bytes y copie la cadena a la dirección y los caracteres. –
Es simple. Ese es el beneficio. –