Pregunta

Hasta donde yo sé, las cadenas son inmutables en Delphi.Yo entiendo que significa que si se hace:

string1 := 'Hello';
string1 := string1 + " World";

la primera cadena es destruido y una referencia a una nueva cadena "Hola Mundo".

Pero, ¿qué sucede si usted tiene la misma cadena en diferentes lugares alrededor de su código?

Tengo una cadena hash asignado para la identificación de varias variables, así por ejemplo, un "cambio" es identificado por un valor de hash de las propiedades de ese cambio.De esta forma es fácil para mí para comprobar que los "cambios" para la igualdad.

Ahora, cada hash se calcula por separado (no todas las propiedades son tomadas en cuenta para que a instancias independientes pueden ser iguales, incluso si difieren en algunos valores).

La pregunta es, ¿cómo Delphi maneja los hilos?Si, calculo que para separar los hash a la misma 10 bytes de la longitud de la cadena, ¿qué puedo hacer?Dos bloques de memoria de 10 bytes o dos referencias al mismo bloque de memoria?

Aclaración: Un cambio está compuesto por algunas de las propiedades de lectura de la base de datos y se genera por un individual de hilo.El TChange clase tiene un método GetHash que calcula un hash basado en algunos de los valores de (pero no todos), resultando en una cadena.Ahora, en otros hilos de recibir el Cambio y tiene que compararlo con el procesado previamente de los cambios para que no se proceso de la misma (lógica) a cambio.Por lo tanto el hash y, como han instancias separadas, dos cadenas diferentes son calculadas.Estoy tratando de determinar si sería una mejora real a cambio de cadena de caracteres a algo así como un hash de 128 bits o va a estar perdiendo mi tiempo.

Editar:La versión de Delphi es Delphi 7.0

¿Fue útil?

Solución

Delphi cadenas se copia en escritura.Si modifica una cadena (sin utilizar el puntero de trucos o técnicas similares para engañar al compilador), no hay otras referencias a la misma cadena se verá afectada.

Delphi cadenas no son internadas.Si usted cree que la misma cadena separada en dos secciones de código, que no comparten la misma copia de la tienda que los mismos datos se almacenan dos veces.

Otros consejos

Delphi cadenas no son inmutables (prueba:cadena1[2] := 'a'), pero son de referencia contada y copy-on-write.

Las consecuencias para su hash no son claras, tendrás que detalle cómo se almacenan etc.

Pero un hash debe depender sólo de los contenidos de un texto, no en la forma en que se almacena.Que hace que toda la cuestión de silencio.A menos que usted lo pueda explicar mejor.

Como otros han dicho, Delphi son las cadenas de caracteres no generalmente inmutable.Aquí hay un par de referencias en las cadenas de caracteres en Delphi.

http://blog.marcocantu.com/blog/delphi_super_duper_strings.html

http://conferences.codegear.com/he/article/32120

http://www.codexterity.com/delphistrings.htm

La versión de Delphi puede ser importante para saber.El buen viejo Delphi BCL controla cadenas como copy-on-write, lo que básicamente significa que una nueva instancia es creada cuando algo en la cadena se cambia.Así que sí, son más o menos inmutable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top