On 03/16/2012 07:52 PM, Xinok wrote:
On Friday, 16 March 2012 at 18:44:53 UTC, Xinok wrote:
On Friday, 16 March 2012 at 15:41:32 UTC, Timon Gehr wrote:
On 03/16/2012 03:28 PM, H. S. Teoh wrote:
More to the point, does dmd perform this optimization currently?
T
No.
immutable string a = "123";
immutable string b = a;
void main(){writeln(a.ptr is b.ptr);} // "false"
It actually does, but only identical strings. It doesn't seem to do
strings within strings.
void foo(string a){
string b = "123";
writeln(a is b);
}
void main(){
string a = "123";
string b = "456";
string c = "123456";
foo(a);
foo(b);
foo(c);
}
Prints:
true
false
false
Captain obvious to the rescue, 'is' is false if the strings are of
different lengths >.<. But it still stands, D doesn't dedup strings
within strings.
void main(){
string a = "123";
string b = "123456";
writeln(a.ptr);
writeln(b.ptr);
writeln(a.ptr);
writeln(b.ptr);
}
Prints:
44F080
44F090
44F080
44F090
I printed it twice to ensure it wasn't duping the strings.
It can't because there must be a terminating zero byte. It does not do
it even if it could though.
immutable string x = "123";
immutable string y = "123";
void foo(string a){
string b = "123";
writeln(a is b);
}
void main(){
string a = "123";
string b = "456";
string c = "456123";
foo(c[3..$]); // false
writeln(x is y); // false
writeln(a is x); // false
writeln(b is x); // false
writeln(a is y); // false
writeln(b is y); // false
foo(a); // true
foo(b); // false
}