C++ 中 Pascal 字符串的数据布局

Data layout for pascal string in C++

"pascal string" 最有效的表示方式是一个字节的大小和最多 255 个字符在 C++ 中的样子:

  1. 包含大小和数据的结构:

    struct Content
        {
        uint8_t size;
        std::array<uint8_t, 255> data;
        }; 
    

    这会将数据直接存储在堆栈上,这应该很快,但是对象会占用一些堆栈space,并且移动操作很昂贵

  2. A std::unique_ptr<Content>(与 (1) 中的 Content 相同)。需要额外的取消引用来访问大小和数据,但移动操作很便宜。

  3. 将大小放在堆栈上,将数据放在堆上。这意味着访问大小很容易,移动操作仍然很便宜。但是,由于在指向数据的指针之前进行填充,因此浪费了 7 个字节。这类似于具有固定容量的 std::vector,因此可能不是很现有,或者?

我发现选项 (1) 是最自然的方法。这使用户可以灵活地将数据存储在堆栈上,而 (2) 强制使用堆存储。