Why I Still Prefer C++ Over Rust

Why I Still Prefer C++ Over Rust

Rust is an impressive language. I am not going to pretend otherwise. It has excellent tooling, strong memory safety, a modern package manager, a passionate community, and real advantages for certain types of systems programming.

But after trying it seriously, building small prototypes, testing workflows, reading through engine code, and experimenting with Rust game development tools, I still keep coming back to C++.

Not because C++ is perfect. It is not. C++ has sharp edges, ugly legacy problems, complicated build systems, and enough footguns to ruin your week. But for the type of work I care about, especially game development, tools, frameworks, rendering, engine architecture, and performance-sensitive systems, C++ still gives me something Rust often takes away: direct control with predictable execution.

This article is not a Rust hate piece. Rust is a serious language. But for my workflow, my background, and the kind of systems I like to build, C++ still feels like the better tool.

The Short Version

Rust gives you safety. C++ gives you control.

That is an oversimplification, but it gets close to the core trade-off.

Rust tries to prevent entire categories of bugs at compile time. That is valuable. But the cost is mental overhead, stricter design pressure, and sometimes slower iteration when you are trying to prototype messy gameplay systems or engine-level ideas.

C++ lets me express what I want more directly. It trusts me more. Sometimes that trust is dangerous, but for experienced developers, that directness is powerful.

My Background with C++

My preference is not coming from reading language debates online. It comes from actually building things.

I have worked with C++ across different types of projects, including:

  • desktop applications with Qt
  • game systems in Unreal Engine
  • small prototypes with Raylib
  • engine-style architecture experiments
  • performance-focused gameplay systems
  • tools and framework-level thinking

Over time, C++ shaped the way I think about software. I like knowing where memory lives. I like understanding object lifetime. I like seeing explicit ownership when I design it myself. I like knowing what runs now, what runs later, and what owns what.

That does not mean C++ always makes these things easy. It means the model is familiar, controllable, and close enough to the machine that I can reason through it.

Why C++ Still Feels Clear to Me

When I write C++, the relationship between code and behavior usually feels direct.

If I change a value, call a function, update an object, or move data through a system, I usually know exactly when that action happens. That kind of immediacy matters a lot in game development.

Games are not just data processing apps. They are live systems. Every frame matters. Input, physics, animation, AI, rendering, audio, UI, and gameplay logic are constantly interacting.

In that kind of environment, predictable execution order is not a luxury. It is survival.

C++ does not force one architecture onto me. I can write object-oriented systems, data-oriented systems, ECS-like systems, procedural systems, component-based systems, or ugly experimental prototypes. The language does not care. That freedom is one of the reasons I still value it.

The Real Appeal of Rust

Rust deserves credit where it earns it.

The tooling is excellent. Compared with classic C++ project setup, Rust feels clean and modern from the first minute.

With Rust, you get:

  • Cargo for project management
  • cargo new for creating projects quickly
  • cargo run for building and running
  • cargo test for testing
  • dependency management that usually feels straightforward
  • a compiler that gives detailed errors
  • strong memory safety guarantees

For a beginner or a developer coming from messy C++ build systems, this can feel amazing.

And honestly, C++ deserves criticism here. CMake, vcpkg, Conan, compiler differences, platform-specific settings, linker issues, and dependency management can still be painful. C++ tooling has improved, but Rust’s default workflow is cleaner.

If we were judging only by project setup, Rust wins.

But tooling is not the whole job.

Rust Safety Is Real, But It Has a Cost

Rust’s safety model is not marketing nonsense. The ownership system, lifetimes, and borrow checker genuinely prevent many memory bugs that C++ developers have to manage manually.

Rust helps protect against problems like:

  • use-after-free bugs
  • data races in safe code
  • dangling references
  • certain lifetime mistakes
  • many accidental ownership errors

That is valuable. Anyone pretending otherwise is being childish.

But those guarantees are not free. The cost is paid in design pressure and mental overhead.

The borrow checker often forces you to structure code in ways that satisfy the compiler before they satisfy your creative or architectural flow. Sometimes that is good because it stops bad design. Sometimes it is just friction.

When I am designing gameplay systems, prototyping engine ideas, or experimenting with architecture, I do not always want to fight the language before I even know whether the idea is good.

The Borrow Checker Problem in Real Workflows

The borrow checker is one of Rust’s greatest strengths, but it is also one of the reasons I do not enjoy using Rust for many game development workflows.

In simple examples, Rust feels beautiful. Ownership is clear. Lifetimes are manageable. The compiler helps you write safer code.

But real software is not always clean. Game systems often have messy relationships:

  • entities referencing systems
  • systems needing shared access to world state
  • animation reacting to gameplay state
  • AI reacting to perception, damage, navigation, and behavior trees
  • UI reading gameplay data while gameplay mutates it
  • physics and rendering using different views of the same objects

Rust can handle these patterns, but it often demands a more carefully structured architecture from the beginning.

That is fine for some teams. For my workflow, especially during prototyping, it slows me down.

My Experience with Bevy

Bevy is one of the most interesting Rust game engines. It uses an Entity Component System architecture, and it has a clean, modern feel compared with many older engine designs.

I understand why developers like it.

ECS can be powerful. It can scale well. It can make data layout cleaner. It can separate behavior from state. It can allow systems to operate over large groups of entities efficiently.

But ECS also adds abstraction.

In a traditional C++ workflow, I can often change a property and immediately follow the effect. The execution path is usually direct enough to trace.

In Bevy-style ECS, behavior flows through systems. Those systems may run in schedules. Execution order can depend on how systems are registered, ordered, or constrained. If you do not manage that carefully, it becomes harder to reason about why something happened before or after something else.

That does not mean Bevy is bad. It means the mental model is different.

Rust Plus ECS Can Become Too Much Mental Overhead

Rust alone already requires you to think carefully about borrowing, ownership, and lifetimes.

ECS also requires you to think carefully about:

  • systems
  • queries
  • component access
  • resource access
  • scheduling
  • execution order
  • event timing
  • deferred commands

Combining both can be powerful, but it can also feel like you are debugging two architectures at the same time.

When something does not work, you ask:

  • Is this a Rust ownership issue?
  • Is this a Bevy schedule issue?
  • Is this a query filter issue?
  • Is the component missing?
  • Did the command apply this frame or next frame?
  • Did another system overwrite the value after this system ran?

That style of debugging is not what I personally enjoy for game systems.

C++ Lets Me Choose the Architecture

One of the biggest reasons I prefer C++ is that it does not force me into a specific style.

If I want classic object-oriented code, I can write it.

If I want a data-oriented layout, I can build it.

If I want an ECS-style system, I can implement or use one.

If I want to prototype something ugly and refactor later, C++ lets me do that.

That freedom matters in early development. Not every idea deserves a perfect architecture from day one. Sometimes you need to build the wrong version fast so you can understand what the right version should be.

Rust can do this too, but it pushes back earlier and harder.

Unreal Engine Is a Huge Reason C++ Still Wins for Me

For game development, Unreal Engine is one of the biggest practical reasons C++ still matters.

Unreal is built around C++ at the engine level. Blueprints are powerful, but serious Unreal architecture often benefits from C++ parent classes, Blueprint children, exposed variables, reusable components, custom systems, and performance-sensitive code living closer to the engine.

If your main engine is Unreal, C++ is not just a language preference. It is the native power layer of the engine.

This matters for:

  • custom gameplay systems
  • actor components
  • performance-sensitive logic
  • AI frameworks
  • editor tools
  • custom plugins
  • engine-level debugging
  • large project architecture

Rust may be interesting, but it is not the primary language of Unreal Engine development. For my work, that is a major practical point.

C++ Has a Mature Ecosystem Rust Still Cannot Fully Replace

C++ has decades of production history behind it. That history is messy, but it is also valuable.

The C++ ecosystem includes:

  • Unreal Engine
  • Qt
  • Raylib
  • SDL
  • OpenGL and Vulkan support
  • DirectX workflows
  • ImGui
  • physics libraries
  • audio libraries
  • networking libraries
  • simulation libraries
  • compiler and platform support across decades

Rust has a growing ecosystem, and some parts of it are excellent. But for game development and engine-level work, C++ still has a massive practical advantage.

It is not always beautiful, but it is battle-tested.

Modern C++ Is Not the Same as Old C++

A lot of Rust arguments compare Rust against an outdated version of C++.

Yes, old C++ codebases can be terrifying. Raw pointers everywhere, manual memory mistakes, macros from hell, undefined behavior, and impossible build systems. I get it.

But modern C++ is not stuck in 1998.

With C++17, C++20, and C++23, you can write much cleaner code using:

  • smart pointers
  • move semantics
  • range-based loops
  • structured bindings
  • std::optional
  • std::variant
  • std::span
  • concepts
  • constexpr improvements
  • modules in supported workflows
  • coroutines where appropriate

Modern C++ still requires discipline, but it gives you tools to write safer and cleaner systems than older C++ did.

If someone writes C++ like it is still C with classes, that is not the language’s only possible style. That is a developer problem too.

C++ Tooling Is Worse Than Rust, But Improving

Rust wins hard on default tooling. Cargo is one of the best parts of Rust.

C++ is still fragmented. There is no single universal build and package workflow that feels as smooth as Cargo.

But the situation is not hopeless.

Modern C++ workflows can use:

  • CMake for cross-platform builds
  • vcpkg for dependency management
  • Conan for package management
  • CLion for strong IDE support
  • Visual Studio for Windows-heavy workflows
  • clangd for language server support
  • Ninja for fast builds

Is this as clean as Cargo? No.

Is it workable for serious development? Absolutely.

This is where I think Rust has the better developer experience, but not enough to make me abandon the control and ecosystem of C++.

Where Rust Is Probably the Better Choice

To be fair, there are areas where Rust makes a lot of sense.

I would seriously consider Rust for:

  • security-sensitive systems
  • network services
  • command-line tools
  • infrastructure tools
  • memory-safety-critical components
  • new backend services where Cargo and safety are major wins
  • systems where concurrency bugs would be extremely expensive

If I were building a low-level service where memory safety and concurrency safety mattered more than creative iteration, Rust would be very attractive.

For large teams with strict safety requirements, Rust can be a better long-term bet.

Where I Still Prefer C++

For my work, C++ remains the better fit in these areas:

  • Unreal Engine development
  • engine architecture
  • gameplay systems
  • graphics experiments
  • desktop tools with Qt
  • small native prototypes with Raylib
  • performance-sensitive experiments
  • systems where I want direct control over memory and execution

In these areas, I value control and flexibility more than compiler-enforced safety.

That does not mean I ignore safety. It means I prefer using C++ discipline, architecture, testing, smart pointers, ownership conventions, and clear boundaries instead of having the language enforce everything for me.

The Real Trade-Off: Safety vs Velocity

The C++ vs Rust debate often turns into religion. That is useless.

The real trade-off is simple:

  • Rust gives stronger safety guarantees but adds stricter design constraints.
  • C++ gives more freedom and direct control but demands more discipline from the developer.

If your priority is preventing memory safety bugs at compile time, Rust is extremely strong.

If your priority is fast iteration, direct engine integration, mature libraries, and full control over architecture, C++ still has a serious edge.

Why I Personally Stay with C++

For me, programming is not only about avoiding bugs. It is about shaping systems clearly.

I want to understand the flow. I want to know when something runs. I want the freedom to design ownership in a way that fits the architecture. I want mature libraries. I want Unreal Engine integration. I want direct performance control.

Rust gives me safety, but too often I feel like I am negotiating with the compiler before I am done thinking through the system.

That is not the workflow I want for game development.

Conclusion

Rust is excellent. It has better default tooling than C++, stronger safety guarantees, and a modern design that solves real problems.

But for my work, C++ still wins.

It gives me directness, mature ecosystems, Unreal Engine access, control over memory and execution, flexible architecture, and a workflow I can reason about without fighting ownership rules every few minutes.

I understand why many developers love Rust. I respect it. I will probably keep experimenting with it. But when I need to build game systems, tools, prototypes, or engine-style architecture, I still reach for C++ first.

Not because C++ is easier. It is not.

I choose it because for the work I care about, it is still the sharper tool.

Frequently Asked Questions

Is Rust better than C++?

It depends on the project. Rust is better for memory safety and modern tooling. C++ is still stronger in many game development, engine, and mature ecosystem workflows.

Is C++ still worth learning?

Yes. C++ remains extremely important in game development, Unreal Engine, graphics, embedded systems, performance-critical software, and native tooling.

Why do game engines still use C++?

C++ offers high performance, direct hardware control, mature platform support, and decades of engine development history. It is deeply embedded in major engines like Unreal Engine.

Is Rust good for game development?

Rust can be good for game development, especially for experimental engines, tools, and safe systems code. But its game development ecosystem is still less mature than C++.

What is the biggest advantage of Rust?

Rust’s biggest advantage is memory safety without a garbage collector, combined with excellent tooling through Cargo.

What is the biggest advantage of C++?

C++ gives direct control, mature libraries, high performance, flexible architecture, and deep integration with major game development tools like Unreal Engine.

Rambod Ghashghai

Rambod Ghashghai

Technical Director & Unreal Engine Educator

Senior systems architect and Unreal Engine technical educator with 11+ years of enterprise infrastructure experience. Director of IT at Tehran Raymand Consulting Engineers and creator of Rambod Dev.

Full profile

Share this page

Send it to your network in one tap.

Instagram doesn’t provide direct web share links. We copy your URL and open Instagram.