Jump to content
  • Advertisement
Sign in to follow this  
_Vicious_

Factory for const string

This topic is 2133 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

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 @?

Share this post


Link to post
Share on other sites

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();

Share this post


Link to post
Share on other sites

@_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. 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!