Factory for const string

Started by
8 comments, last by _Vicious_ 10 years, 3 months ago

Hello Andreas,

is it possible to register factory for a constant string handle? The reason I'm asking is that would allow to reduce the number of allocations in the app by storing the string struct and the string buffer in the same memory region, knowing that the string is immutable.

Advertisement
The scriptstdstring add-on implements a stringpool to avoid allocating new strings for every string literal in the script.

I believe this is exactly what you're looking for.

AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

Not exactly, but close. Using hash tables or maps introduces quite a bit of an overhead.

We're also using ref-counting on strings, in this case, how does a const string type declaration look like? const String @& ? or simply const String @?

It doesn't seem like AngelScript treats literal strings a constant strings, since I am able to call non-constant functions from a literal string.

"Hello World".clear();

@_Vicious_

Since you're using refcounted strings you'll want to implement/register your string factory to return 'const String @' and have it return the pointer to the same instance for each string literal. (remember to increment the ref counter for each call).

@Jason

It depends on how you've registered the string factory. If it is registered as returning a const string &/@ then the literal will not be modifiable. But if you've registered as returing a string by value or a non-const ref/handle than the string will be modifiable.

AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

Thanks Andreas!

Quite can't figure out what's going on here, looks like an AS bug to me...

Consider the following code:


String response = "";
...
String manifest = gametype.manifest;
...
response += "Author: " + (true ? "1" + manifest : "0") + "\n";

Compilation fails with the following error:

bomb/main.as 257:36: Can't implicitly convert from 'const String@' to 'String@&'.
^1ERROR:
bomb/main.as 257:29: Both expressions must have the same type
^1ERROR:

However, the following code compiles just fine:


response += "Author: " + "1" + manifest + "\n";

It looks like the ? : operator somehow interferes with string types or something.. Here's full code of the string class: https://github.com/viciious/qfusion/blob/master/source/angelwrap/addon/addon_string.cpp

I believe the problem is that first result for the ?: operator gives a 'String@' after the + operator, and the second result gives a 'const String@' since it returns the literal directly.

It should be relatively easy to have the compiler cast the first result to 'const String @' too in this case. I'll make this change as soon as possible.

Until then you can work around this by avoiding the use of the ?: in this case, i.e. by using ordinary if/else. Or you can force a concatenation in the second result to, e.g:

response += "Author: " + (true ? "1" + manifest : "0" + "") + "\n";

Regards,

Andreas

AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

I've fixed this in revision 1802.

Thanks,

Andreas

AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

Thanks Andreas!

This topic is closed to new replies.

Advertisement