boost::beast::static_string memcopyable/trivial 是类型吗?
Is boost::beast::static_string memcopyable/trivial type?
我正在寻找可以在 memcopy 环境中使用并且易于构造和复制的具有固定上限大小的字符串实现。
我找到了 boost beast static_string,但我不知道我的 example 是否正常工作?
#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;
}
注意:最后一行说类型不可简单复制,但可能只是 Vinnie 忘记添加类型特征。
P.S。我知道这通常是个坏主意,我要替换的东西更糟,只是一个普通的 C 数组并修改 allocation/copying 以支持 std::string 需要更多的工作。
技术上没有,有用户定义的复制构造函数和运算符(都调用 assign
),这意味着 class 不是 trivially copyable。
这些似乎作为一种优化而存在,如果 static_string
的大小很大,但只存储一个小的字符串,assign
只复制字符串的使用部分,加上一个空终止符.
C++ 不允许 std::is_trivially_copyable
被程序特化,所以我认为目前没有办法同时获得这两者。
static_string
确实只包含一个 size_t
成员和一个 CharT[N+1]
,所以如果这两个是默认的,那就是。
我正在寻找可以在 memcopy 环境中使用并且易于构造和复制的具有固定上限大小的字符串实现。
我找到了 boost beast static_string,但我不知道我的 example 是否正常工作?
#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;
}
注意:最后一行说类型不可简单复制,但可能只是 Vinnie 忘记添加类型特征。
P.S。我知道这通常是个坏主意,我要替换的东西更糟,只是一个普通的 C 数组并修改 allocation/copying 以支持 std::string 需要更多的工作。
技术上没有,有用户定义的复制构造函数和运算符(都调用 assign
),这意味着 class 不是 trivially copyable。
这些似乎作为一种优化而存在,如果 static_string
的大小很大,但只存储一个小的字符串,assign
只复制字符串的使用部分,加上一个空终止符.
C++ 不允许 std::is_trivially_copyable
被程序特化,所以我认为目前没有办法同时获得这两者。
static_string
确实只包含一个 size_t
成员和一个 CharT[N+1]
,所以如果这两个是默认的,那就是。