Не попадитесь на накрученные каналы! Узнайте, не накручивает ли канал просмотры или подписчиков Проверить канал на накрутку
Прикрепить Телеграм-аккаунт Прикрепить Телеграм-аккаунт

Телеграм канал «C++: Хроники Дурки🚑»

C++: Хроники Дурки🚑
58
0
9
2
0
Очень люблю C++, но это скорее уже стокгольмский синдром.
Постоянно нахожу способы стрельнуть себе в ногу.
Подписчики
Всего
922
Сегодня
0
Просмотров на пост
Всего
732
ER
Общий
79.39%
Суточный
29.83%
Динамика публикаций
Telemetr - сервис глубокой аналитики
телеграм-каналов
Получите подробную информацию о каждом канале
Отберите самые эффективные каналы для
рекламных размещений, по приросту подписчиков,
ER, количеству просмотров на пост и другим метрикам
Анализируйте рекламные посты
и креативы
Узнайте какие посты лучше сработали,
а какие хуже, даже если их давно удалили
Оценивайте эффективность тематики и контента
Узнайте, какую тематику лучше не рекламировать
на канале, а какая зайдет на ура
Попробовать бесплатно
Показано 2 из 58 постов
Смотреть все посты
Пост от 26.10.2026 11:49
275
6
3
Ковырял тут вот эту библиотеку:

https://github.com/yandex/yaff/blob/c815bc0a2469201542c4734257628a98ed794c30/include/yaff/base.h#L146-L160

Это высокопроизводительный яндексовый сериализатор бинарного формата. Который берет протобафную схему, но конфигурирует совершенно другую сериализацию.

Нашел там вот такой код:


template <typename T>
inline constexpr T XorDef(T v, T d) noexcept {
return v ^ d;
}

template <>
inline constexpr float XorDef(float v, float d) noexcept {
return std::bit_cast<float>(std::bit_cast<uint32_t>(v) ^ std::bit_cast<uint32_t>(d));
}

template <>
inline constexpr double XorDef(double v, double d) noexcept {
return std::bit_cast<double>(std::bit_cast<uint64_t>(v) ^ std::bit_cast<uint64_t>(d));
}


И пытался понять, зачем он там.

Что выяснилось. Мы хотим в сообщении "дефолтное" значение записывать нулевыми байтами. При этом при чтении хотим получать из нулевых байтов дефолтное значение. Поэтому мы при чтении делаем вот так:


YAFF_PURE T ReadValueUnsafe(const FieldOffset offset, const T defaultVal) const noexcept {
return XorDef(yaff::ReadValue<T>(Message() + offset), defaultVal);
}
YAFF_PURE T ReadValueUnsafe(const FieldOffset offset, const T defaultVal) const noexcept {
return XorDef(yaff::ReadValue<T>(Fields() + offset), defaultVal);
}


А при записи вот так:


void AddField(FieldId id, T value, T def) {
WriteField<T>(id, XorDef(value, def));
}



Из приятного: если наше дефолтное значение - нули, то компилятор этот xor соптимизирует.

Это ли не блеск, это ли не шик, это ли не прелесть.
❤ 7
🥴 2
💅 1
Пост от 28.09.2026 09:11
238
2
10
Я в очередной раз искал медь, а нашел золото.

Я чуть-чуть погрузился в bit_cast. Ввели такой в С++20 каст побитовый.

Он передает бит к биту из одного объекта в другой.

Условия просты:

```
sizeof(To) == sizeof(From) is true;
is_trivially_copyable_v<To> is true; and
is_trivially_copyable_v<From> is true.
```

И я искал воспроизводящий пример как он ведет себя с padding byte и ломается ли у нас что-то (если у вас такой есть - несите в предложку).

Но наткнулся на вот такой веселый пример.

struct alignas(int) Empty {};
static_assert(sizeof(Empty) == sizeof(int));

int main() {
const int x = std::bit_cast<int>(Empty{});
std::printf("%d %d", x == 0, x != 0);
}

И у нас clang весело выводит

0 0

x и равен нулю, и неравен нулю (оба сравнения false).

И если вы думаете, что на этом все закончено, то нет. Если убрать флаг -O2 из флагов компиляции, вывод будет

0 1

А в gcc вывод с O2 и без O2 выглядят так

1 0
0 1

Кароче, bit_cast временно вычеркиваю из инструментов до дальнейшего разбирательства.
😁 14
🤯 5
❤ 1
👍 1
Смотреть все посты