0

我正在寻找一个可以在 memcopy 环境中使用的具有固定大小的字符串实现,并且可以简单地构造和复制。

我找到了 boost beast static_string,但是如果我的示例是偶然起作用的,IDK 会怎样?

#include <algorithm>
#include <iostream>
#include <boost/beast/core/static_string.hpp>
boost::beast::static_string<16> s1("abc");

int main(){
    boost::beast::static_string<16> s2;
    std::copy_n((char*)&s1, sizeof(s2), (char*)&s2);
    s1.push_back('X');
    std::cout << "--" << std::endl;
    std::cout << s2 << std::endl;
    s2.push_back('Y');
    std::cout << s2 << std::endl;
    std::cout << std::is_trivial_v<decltype(s2)> << std::endl;
}

注意:最后一行说 type 不是简单可复制的,但可能只是 Vinnie 忘记添加类型特征。

PS 我知道这通常是个坏主意,我要替换的更糟糕的是,只是一个普通的 C 数组并修改分配/复制以支持 std::string 的工作要多得多。

4

1 回答 1

3

从技术上讲,没有,有用户定义的复制构造函数和操作符(都 call assign),这意味着该类不是平凡可复制的。

这些似乎是作为优化存在的,如果 astatic_string的大小很大,但只存储一个小字符串,assign只复制字符串的使用部分,加上一个空终止符。

C++ 不允许std::is_trivially_copyable被程序专门化,所以我不相信目前有办法同时获得两者。

static_string确实只包含一个size_t成员和一个CharT[N+1],所以如果这两个是默认的,那就是。

于 2020-03-09T10:04:04.440 回答