Реализация побитовой замены для MyStringC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Реализация побитовой замены для MyString

Сообщение Anonymous »

Правильны ли следующие операции перемещения, поскольку в них нет UB.
Вместо двух свопов я хочу реализовать одну замену 16 байт MyString.

Код: Выделить всё

class MyString {
std::size_t size_;
char* str_;

MyString(const char* str, std::size_t len): size_(len), str_(size_ ? new char[size_+1] : nullptr) {
if (size_) {
memcpy(str_, str, len+1);
}
}

void bitwise_swap(MyString* l, MyString* r) {
constexpr size_t size = sizeof(MyString);
alignas (MyString)  char tmp[size]; // is alignas even necessary?
std::memcpy(&tmp, l, size);
std::memcpy(l, r, size);
std::memcpy(r, &tmp, size);
}

public:
MyString(const char* str = ""): MyString(str, strlen(str)) {
}

MyString(MyString&& s) noexcept : size_(0), str_(nullptr) {
bitwise_swap(this, &s);
}

MyString& operator=(MyString&& s) {
bitwise_swap(this, &s);
return *this;
}

~MyString() {
delete[] str_;
}
};
Обратите внимание, что MyString явно не поддается простому копированию. Однако я всегда заменяю внутреннее битовое представление одного объекта MyString другим.
Кроме того, меня устраивает замена оператора = на его параметр. Если получено xvalue (т. е. lvalue, которое было std::moved, меня устраивает, что оно несет мой «мусор»). Итак, сравните с этими версиями:

Код: Выделить всё

MyString(MyString&& s) noexcept : size_(0), str_(nullptr) {
std::swap(size_, s.size_);
std::swap(str_, s.str_);
}
И:

Код: Выделить всё

MyString& operator=(MyString&& s) {
std::swap(size_, s.size_);
std::swap(str_, s.str_);
return *this;
}
Если этот код действителен.
Некоторые (справедливо) скажут, что это преждевременная оптимизация, но может ли кто-нибудь утверждать, что одна версия обычно более эффективна, чем другая, или что типичные компиляторы обычно сами выполняют такую ​​оптимизацию? т.е. превратите два свопа по 8 байт в один своп по 16 байт.

Подробнее здесь: https://stackoverflow.com/questions/792 ... r-mystring
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»