Cost of enum-to-string: C++26 reflection vs. the old ways

(vittorioromeo.com)

30 points | by sagacity 5 hours ago

8 comments

  • jsd1982 18 minutes ago
    I think the conclusion section should indicate that they are based entirely on GCC 16's behavior and current implementation. We should avoid generalizing one compiler's behavior and performance. Curious how this same test would behave once clang ships C++26 reflection.
    • bluGill 15 minutes ago
      I was thinking the same thing. Modules are still not widely used, it is a reasonable guess that there are a lot of optimization opportunities left.
  • w4rh4wk5 1 hour ago
    I've been wondering about debug-ability of code using reflection. X-Macros are quite annoying to step through in most debuggers, though possible. While the code in the first example is evaluated fully at compile-time, how would you approach debugging it?
    • cenamus 30 minutes ago
      I mean it's still C++ that's compiled and executed, surely the compiler would be able to provide a way to hook into that?
  • randusername 35 minutes ago
    I can't imagine myself using reflection much, but maybe it will eliminate a lot of feature proposals bogging down the committee and they can focus on harder problems.

    It would be cool if the stated goal of C++29 was compile times.

    • w4rh4wk5 21 minutes ago
      I'd argue reflection is very much a feature for libraries. You wouldn't use it directly, but your JSON / YAML serialize is then built on top of it. So are your bindings for scripting engines like Lua.
  • HarHarVeryFunny 1 hour ago
    No doubt reflection has been built with other use cases in mind, but it sure would have been nice just to have std::to_string(enum)
    • bluGill 39 minutes ago
      C++ conference speakers (including keynotes) are now begging everyone to stop using enum to string in their example. While they are a simple and easy to understand example, reflection is for much more interesting problems. I can't think of any other example that I would type into a comment box or put on a slide.
      • surajrmal 34 minutes ago
        Anybody the derive traits rust has are a good demo.
  • sagacity 5 hours ago
    Oof, that first example (the idiomatic C++26 way) looks so foreign if you're mostly used to C++11.
    • randusername 1 hour ago
      I was a fool to assume that the same forces shaping the ugliness of C++ syntax would not also be at work in C++ 26.
    • ginko 1 hour ago
      Is it? I'm mostly used to (pre-)C++11 and the only unusual operators I see are ^^T (which I presume accesses the metadata info of T) and [:e:] (which I assume somehow casts the enumerator metadata 'e' to a constant value of T).

      And template for but I assume that's like inline for like in zig.

      • CamouflagedKiwi 1 hour ago
        requires is also new (not sure exactly when that appeared, it's after the last time I wrote C++ in anger) although I think it's fairly clear what it means. I can only guess at the other two.

        Not familiar with Zig but AFAICT `inline for` is about instructing the compiler to unroll the loop, whereas `template for` means it can be evaluated at compile time and each loop iteration can have a different type for the iteration variable. It's a bit crazy but necessary for reflection to work usefully in the way the language sets it up.

    • bluGill 38 minutes ago
      You realize c++11 is closer in age to C++98 than C++26?
  • king_geedorah 51 minutes ago
    Another win for X macros and for C style in general, though the author didn’t declare it as such.
    • SuperV1234 22 minutes ago
      Author here. It isn't a clear "win" at all, there are tradeoffs to each approach.
  • TZubiri 19 minutes ago
    "Enum to string"

    We've come full circle huh?

    Why do you need this, logging? In that case I would rather reflect the logging statement to pribt any variable name, or hell, just write out the string.

    If saving for db, maybe store as string, there's more incentive for an enum in the db, if that's a string you might as well. At any rate it doesn't seem a great idea to depend on a variable name, imagine changing a variable name and stuff breaks.

  • jesgran 4 hours ago
    [dead]