immutable strings vs std::string
I found most people in this thread do not really understand what immutable_string
is. It is not only about the constness. The really power of immutable_string
is the performance (even in single thread program) and the memory usage.
Imagine that, if all strings are immutable, and all string are implemented like
class string {
char* _head ;
size_t _len ;
} ;
How can we implement a sub-str operation? We don't need to copy any char. All we have to do is assign the _head
and the _len
. Then the sub-string shares the same memory segment with the source string.
Of course we can not really implement a immutable_string only with the two data members. The real implementation might need a reference-counted(or fly-weighted) memory block. Like this
class immutable_string {
boost::fly_weight<std::string> _s ;
char* _head ;
size_t _len ;
} ;
Both the memory and the performance would be better than the traditional string in most cases, especially when you know what you are doing.
Of course C++ can benefit from immutable string, and it is nice to have one. I have checked the boost::const_string
and the fix_str
mentioned by Cubbi. Those should be what I am talking about.
As an opinion:
- Yes, I'd quite like an immutable string library for C++.
- No, I would not like std::string to be immutable.
Is it really worth doing (as a standard library feature)? I would say not. The use of const gives you locally immutable strings, and the basic nature of systems programming languages means that you really do need mutable strings.
My conclusion is that C++ does not require the immutable pattern because it has const semantics.
In Java, if you have a Person
class and you return the String name
of the person with the getName()
method, your only protection is the immutable pattern. If it would not be there you would have to clone()
your strings all night and day (as you have to do with data members that are not typical value-objects, but still needs to be protected).
In C++ you have const std::string& getName() const
. So you can write SomeFunction(person.getName())
where it is like void SomeFunction(const std::string& subject)
.
- No copy happened
- If anyone wants to copy he is free to do so
- Technique applies to all data types, not just strings