Homebrew std::string for use with kernel
In operator=(), you should always first check to see whether you're doing a self-assignment and do an early exit:

fixed_string &amp;operator =(const fixed_string &amp;other)
{
    if (this == &amp;other) {
        return *this;
    }
    assign(other._buffer, other._length);
    return *this;
}


I would write the found assignment as the more explicit:

if (*buffer == other[found]) {
    found++;
} else {
    found = 0;
}


The compiler will generate the equivalent code to yours.

In fact, your find has a bug. Consider:

fixed_string&lt;10&gt; a = "abcabcd";
assert(a.find("abcd") == 3);


Your assign method calls strlcpy incorrectly. Instead of calling with _length as the third parameter, use the actual size of the buffer:

strlcpy(_buffer, string, sizeof(_buffer));


As a matter of style, I would always surround conditional blocks with braces, even if they only contain one statement:

bool operator ==(const fixed_string &amp;other) const
{
    if(_length != other._length) {
        return false;
    }
    // ...