-
-
Notifications
You must be signed in to change notification settings - Fork 21.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Soft-deprecate the use of implicit reliance on NULL-terminated strings. #99806
base: master
Are you sure you want to change the base?
Conversation
1b8e3da
to
1cb5c1e
Compare
1cb5c1e
to
9bc994c
Compare
Sounds interesting! Can you share the results of your profiling so we have an idea of what kind of performance differential to expect? |
Will do once I get everything rolling again! It's still stuck between not compiling or causing segfaults, hopefully to resolve soon :) |
In that case, I've marked this as draft so maintainers aren't poked every time this is updated. Please mark it as ready for review once it's functioning and you are ready for a review |
9bc994c
to
718bad9
Compare
I'm putting implementation of this PR on ice. It was looking very promising, but at the very end implicit conversions to When some preliminary work has been done, i hope to be able to continue work on this PR. |
5e802c3
to
691af48
Compare
…icitly parse the given string to find its end. Add known-length constructors and explicit from_c_str static methods.
691af48
to
54d429b
Compare
Hello @Ivorforce ! I hope you're doing well. The release team found out that you were updating your PR a lot lately. Could you add a tag in your commit message when CI checks are not needed? (see https://docs.github.com/en/actions/managing-workflow-runs-and-deployments/managing-workflow-runs/skipping-workflow-runs) It's because each time you push an update, even a tiny one, it triggers full CI checks. 😅 |
Yep, sorry, will do! |
"MVP" of addressing godotengine/godot-proposals#11249. The motivation for this direction are discussed there (and linked issues). This PR does not yet change assumptions about user-supplied strings;
NULL
termination checks are only avoided for static strings supplied from the codebase.This change is toggled with the c++-define
GODOT_SHOW_STR_DEPRECATIONS
(off by default). For unowned string references,StrRange
can be used, which avoids allocation overhead. This is already employed insprintf
andoperator+
in this PR, because there are a lot of uses of these functions.This change is as minimal as I could realistically get it to be:
ustring
has quite a lot of changes, but most other files work exactly as before. This changes whenGODOT_SHOW_STR_DEPRECATIONS
is toggled: Suddenly, the console explodes into a flurry of warnings, becausestrlen
is used in a place where it may be inappropriate and wastes CPU cycles.This PR should already slightly improves performance by letting callers pass their
string[]
asstring[]
with known lengths, rather than having it recomputed immediately. Every change we will make to get rid of anotherGODOT_SHOW_STR_DEPRECATIONS
deprecation warning will improve the engine speed further. Every function we can make refactor to useStrRange
instead of String will reduce allocations and improve engine speed.Please, participate in lively discussion! I realize merging this is kind of a large ask, especially from a pretty fresh contributor like myself. I tried to make the change as unopinionated as possible, and focused on just improving speed and conditions for future PRs to improve speed further.
Still, I personally think this direction is unavoidable sooner or later, if we want to make the best use of clock cycles for the hard parts elsewhere. Also, i have heard it mentioned a few times that the Godot source code has a side-mission as a learning tool - making computation explicit to avoid accidental promotions and data copies is very important in clean and fast code :)