2012-02-08 19 views
5

Duplicar posible:
C/C++: Optimization of pointers to string constants¿Se duplican las referencias de cadena?

Suponga que tiene una cadena "example" se define en una gran cantidad de lugares

// module1.h 
char *x = "example"; 
// module2.h 
char *a[] = { "text", "example" }; 
// module3.c 
printf("example"); 
//etc. 

Will se duplicará estos datos o serán las marcas del compilador solo una referencia a eso?

+0

Depende del compilador/enlazador y las opciones. Creo que la optimización de todo el programa y un enlazador inteligente combinarán los duplicados pero no recordarán los materiales de referencia. – JimR

Respuesta

8

Es dependiente de la implementación. Pero ese era el espíritu de la propiedad inmutable de los literales de cadenas.

Citando del C99 Fundamento en los literales de cadena:

"literales de cadena no están obligados a ser modificables Esta especificación permite implementaciones para compartir copias de cadenas de texto idéntico, para colocar las cadenas literales en lectura. -solo memoria, y para realizar ciertas optimizaciones "

0

Es un detalle de implementación y los escritores de compiladores pueden hacerlo de la forma que deseen. Muchos compiladores tienen un interruptor para controlar si las constantes de cadena duplicadas se refieren o no a la misma dirección.

2

Ese es un "detalle de implementación". Esto significa que algunos compiladores inteligentes unificarán las cadenas en la memoria mientras que otros harán copias separadas.

Y, por último, algunos compiladores hará una cosa con ciertas opciones del compilador y otras cosas con otras opciones ...

+0

Esto no es * implementación definida * en el sentido de que la implementación no tiene que documentar este detalle de implementación (como se requiere con los comportamientos definidos de implementación) pero, por supuesto, esto depende de la implementación. – ouah

+0

@ouah En otras palabras, está documentado como no documentado ;-) – Neil

+0

@ouah - Detalles sutiles, y una buena aclaración. Editó la respuesta para evitar confusiones. – rodrigo

Cuestiones relacionadas