Является ли boost :: beast :: static_string memcopyable / тривиальным типом? - PullRequest
0 голосов
/ 09 марта 2020

Я ищу строковую реализацию с фиксированным верхним размером, которая может быть использована в среде 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;
}

примечание: последняя строка говорит, что тип копируется не тривиально, но возможно, Винн ie забыл добавить черту типа.

PS Я знаю, что это вообще плохая идея, то, что я заменяю, еще хуже, просто простой массив C, и изменение выделения / копирования для поддержки std :: string - это гораздо больше работы.

1 Ответ

3 голосов
/ 09 марта 2020

Технически нет, существуют определенные пользователем конструкторы и операторы копирования (оба вызывают assign), что означает, что класс не тривиально копируемый .

Похоже, они существуют как оптимизация, если static_string имеет большой размер, но хранит только небольшую строку, assign копирует только использованную часть строки плюс нулевой терминатор.

C ++ не допускает std::is_trivially_copyable специализируется на программах, поэтому я не верю, что есть способ получить и то, и другое.

static_string просто содержит size_t член и CharT[N+1], поэтому если бы эти два были по умолчанию, это было бы.

...