Efficient, easy, and safe string manipulation

Stable C++17 Code Size Impact: 500 to 1500 bytes

  • Efficient: No memory allocation, no pointer indirection.

  • Easy: Use the string API you already know.

  • Safe: Never worry about buffer overruns or undefined behavior.

Pick three! If you know how to use std::string, just use pw::InlineString in the same way:

// Create a string from a C-style char array; storage is pre-allocated!
pw::InlineString<16> my_string = "Literally";

// We have some space left, so let's add to the string.
my_string.append('?', 3);  // "Literally???"

// Let's try something evil and extend this past its capacity 😈
my_string.append('!', 8);
// Foiled by a crash! No mysterious bugs or undefined behavior.

Need to build up a string? pw::StringBuilder works like std::ostringstream, but with most of the efficiency and memory benefits of pw::InlineString:

// Create a pw::StringBuilder with a built-in buffer
pw::StringBuffer<32> my_string_builder = "Is it really this easy?";

// Add to it with idiomatic C++
my_string << " YES!";

// Use it like any other string
PW_LOG_DEBUG("%s", my_string_builder.c_str());

Check out Get Started & Guides for more code samples.

String manipulation on embedded systems can be surprisingly challenging.

  • C strings? They’re light-weight but come with many pitfalls for those who don’t know the standard library deeply.

  • C++ strings? STL string classes are safe and easy to use, but they consume way too much code space and are designed to be used with dynamic memory allocation.

  • Roll your own strings? You don’t have time! You have a product to ship!

Embedded systems need string functionality that is both safe and suitable for resource-constrained platforms.

pw_string provides safe string handling functionality with an API that closely matches that of std::string, but without dynamic memory allocation and with a much smaller binary size impact.

Is it right for you?#

pw_string is useful any time you need to handle strings in embedded C++.

If your project written in C, pw_string is not a good fit since we don’t currently expose a C API.

On the other hand, for larger platforms where code space isn’t in short supply and dynamic memory allocation isn’t a problem, you may find that std::string meets your needs.


pw_string works just as well on larger embedded platforms and host systems. Using pw_string even when you could get away with std:string gives you the flexibility to move to smaller platforms later with much less rework.

Get Started & Guides

Integrate pw_string into your project and learn common use cases

API Reference

Detailed description of the pw_string’s classes and methods

Design & Roadmap

Learn why pw_string is designed the way it is, and upcoming plans

Code Size Analysis

Understand pw_string’s code footprint and savings potential