User Tools

Site Tools


wiki:data:pages:dev:shared_strings

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
wiki:data:pages:dev:shared_strings [2024/05/23 18:18]
leaf Remove wiki-data version of shared_strings page
— (current)
Line 1: Line 1:
-To minimize memory use, Crossfire uses a shared string mechanism. This is intended to be used for strings whose contents is not expected to change during the server'​s life. Using shared strings saves memory and improved performance. 
  
-Those strings are used like regular ''​const char*'',​ but should not be changed via ''​strcpy'',​ ''​snprintf''​ or other means because it would affect **all** structures using the shared string. Internally, they use a counter to track at how many places they are used. When it reaches 0, string is freed. 
- 
-To alter such a string, the right behaviour is: 
-  * write new value in a ''​char[] new_value''​ variable 
-  * use ''​free_string(str)''​ 
-  * call ''​str = add_string(new_value)''​ 
- 
-FIXME replace with sstring when done in code 
- 
-To manipulate them, the following functions (defined in ''​[[http://​crossfire.svn.sourceforge.net/​viewvc/​crossfire/​server/​trunk/​common/​shstr.c?​view=markup|common/​shstr.c]]''​) are available: 
-  * ''​const char* add_string(const char *str)'',​ used to share a string. Returned value is a string with the same contents that can be shared with other objects 
-  * ''​const char* add_refcount(const char *str)'',​ equivalent of ''​add_string''​ when the string is already a shared string 
-  * ''​const char* find_string(const char *str)'',​ to search if a string is shared or not 
-  * ''​void free_string(const char *str)'',​ to decrement the use counter. After it's called, ''​str''​ should not be used anymore. 
- 
-Because shared strings will return a pointer to a string if it exists, one can see if the strings are equal by comparing the shared string address they point to (ie ''​str == str2''​ directly).