Отправляет email-рассылки с помощью сервиса Sendsay

RSS-канал «Форум 'C/C++' на RSDN»

Доступ к архиву новостей RSS-канала возможен только после подписки.

Как подписчик, вы получите в своё распоряжение бесплатный веб-агрегатор новостей доступный с любого компьютера в котором сможете просматривать и группировать каналы на свой вкус. А, так же, указывать какие из каналов вы захотите читать на вебе, а какие получать по электронной почте.

   

Подписаться на другой RSS-канал, зная только его адрес или адрес сайта.

Код формы подписки на этот канал для вашего сайта:

Форма для любого другого канала

Последние новости

билдить мапы
2024-05-30 12:34 andrey.desman

Хочется писать для всяких заранее известных мапов что-то типа:
std::unordered_map<std::string, Object> m{
    { "abc", 1 },
    { "qwe", "zxc" },
};


Оно-то работает, но элементы initializer_list не мувабельны, а дважды создавать одно и то же не очень хочется.

Есть хак с const_cast из initializer_list. Есть еще "более лучший" хак с прокси-объектом, который запоминает, был ли элемент пары rvalue, и потом позволяет вымувнуть если да. Но хаком он от этого быть не перестает.

Написать шаблон, который принимает переменное количество std::pair, да так, чтобы работала запись в фигурных скобках (makeMap({1, 2}, {3, 4}, {5, 6})) вроде тоже нельзя.

Остается что-то вроде такого:
namespace details {
    template<typename Map, typename K, typename V>
    void mapEmplace(Map& m, K&& k, V&& v) {
       m.emplace(std::forward<K>(k), std::forward<V>(v));
    }
    template<typename Map, typename K, typename V, typename... Args>
    void mapEmplace(Map& m, K&& k, V&& v, Args&&... args) {
       m.emplace(std::forward<K>(k), std::forward<V>(v));
       mapEmplace(m, std::forward<Args>(args)...);
    }
}

template<typename Map, typename... Args>
Map buildMap(Args&&... args) {
    static_assert(sizeof...(args) % 2 == 0);
    Map m;
    m.reserve(sizeof...(args) / 2);
    details::mapEmplace(m, std::forward<Args>(args)...);
    return m;
}

using Map = std::unordered_map<std::string, Object>;

Map m = buildMap<Map>(
    "abc", 1,
    "qwe", "zxc"
);


У такого варианта очевидные проблемы с путаницей k/v (особенно если там какой-нибудь std::any есть), и оно рекурсивное.

Есть еще что-то, что можно выдумать +/- интуитивно понятное?

проблема с memcpy на Linux
2024-05-29 22:23 maks1180

вызываю memcpy(dst, src, len), где src=dst+90, len=137. dst всегда кратен 16.
Т.е. диапазоны перекрываются, но так как src больше чем dst, поэтому я думал проблем ну будет.
Но вышла проблема, причём самое интересное, что проявляется переодически.
Заметил, что когда dst заканчивает на B0,С0,D0 проблема есть. Т.е. 3 из 16 раз.

Пытался посмотреть исходники memcpy, понял что он копирует вперёд (т.е. увеличивая поинтеры), но возможно кусочек начала копирует в конце поэтому и проблема,
но я не понял почему оно зависит от адреса dst.

Вопрос по итераторам
2024-05-23 09:47 LaptevVV

Пишу простейшую лабу для работы с array
код функции
// -- работает с другим размером
double Summa(const array<double,5>::iterator start, const array<double,5>::iterator finish){
    double summa = 0.0;
    auto it = start;
    while(it != finish){
        summa += *it;
        ++it;
    }
    return summa;
}
Специально поставил размер 5.
Вызываю в main с для массива размером 10
array<double,10> d {1,1,1,1,1,2,2,2,2,2};
   double s = Summa(begin(d), end(d));
   cout << s << endl;

Почему не ругается на несоответствие размеров.
Во всех других случаях ругается.

Компилятор gcc 8.1 в minGW под CodeBlocks
С++17

unique_ptr, c in-place размещением объекта.
2024-05-22 15:54 Chorkov

Есть интерфейс, и несколько наследников.
class IFace { public: virtual int foo()=0; };
class A : public IFace { public: virtual int foo() { return 1;} };
class B : public IFace { public: virtual int foo() { return 2;} };

Все классы-наследники мне заранее известны. Новых не будет.
Сейчас я храню умный указатель
std::unique_ptr<IFace>
, но это получается не очень дружественно к расположению в памяти.
Если я заменяю на
std::variant<A,B>
— производительность растет.

Но, писать visit для обращения к каждому методу — неудобно.
Если через visit написать запрос интерфейса [ccode] IFace& get_IFace(std::variant<A,B>&);[ccode], то просядет производительность. (два вызова виртуальных функций, вместо одного.)

Можно сделать аналог unique_ptr, но с размещением на арене, которая хранится в самом указателе? (И копируется при копировании указателя.)
Или есть какое-то простое решение на компонентах stl/boost?

Записи докладов с C++Russia 2023
2024-05-18 15:37 so5team

В преддверии конференции C++Russia 2024 организаторы выложили на YouTube записи докладов с прошлогодней C++Russia 2023. Публикация прошлогодних докладов началась месяца три назад но по одному докладу в неделю, а пару дней назад вроде как выложили вообще все.

На данный момент на канале конференции доступны следующие видео (если к докладу прилагались слайды, то рядом приведена и ссылка на PDF-ку):

Евгений Григорчук — GPU Driven Rendering Pipeline, или Как пишется графика в современных видеоиграх, PDF

Юрий Грибов — Как правильно писать компараторы, PDF

Илья Казаков — Кастомизируем ASIO, PDF

Дмитрий Мельник — Безопасный компилятор: надежная оптимизация и улучшение защищенности кода, PDF

Эрнест Асанов — Модель асинхронности в C++: теория и практика

Антон Сысоев — Dynamic Libraries for Bare Metal, PDF

Илья Шишков — Что-то у меня тормозит: заглядываем внутрь С++ контейнеров, PDF

Тот самый стендап от Павла Филонова на C++ Russia 2023

Дмитрий Ермолов — Roren — С++ фреймворк для описания пайплайнов распределенных вычислений, PDF

Ростислав Михеев — Эффективное использование GPU на примере разработки игр, PDF

Олег Сенин — Sizecoding: взгляд изнутри

Максим Кита — Техники оптимизации производительности, PDF

Александр Еналдиев — C++ Experiments: The Battle Continues: Cpp2 vs Carbon, PDF

Иван Смирнов — YsonStruct: дешевая сериализация иерархических JSON-структур, PDF

Владимир Ситников — B-tree индексы в базах данных на примере SQLite и PostgreSQL

Артем Хорошев — Ускоряем синтез: от TensorRT до CUDA C++, PDF

Аяз Салихов — Имплементируем класс tuple в 100 строк кода, PDF

Ashot Vardanian — Advanced Linux Kernel Bypass Techniques in 2023

Егор Суворов — Санитайзеры и стандарт не спасут, PDF

Александр Ганюхин — Машина состояний: непридуманная история

Rainer Grimm — Concurrency Patterns, PDF

Денис Легезо — Злые фреймворки и генерируемый ими позиционно-независимый код, PDF

Елена Веселовская — Как перейти от ученичества к работе, PDF

Андрей Аксенов — Про алгоритмы в поисковых движках

Техническое интервью: Архитектурная секция

Сергей Ларин, Владислав Столяров — Как сделать фронтенд компилятора в домашних условиях, PDF

Антон Потапов, Антон Малахов — Учим Кукушку Летать, или ConcurrentHashMap with Seqlocks, PDF

Александр Фокин — Designing Robust APIs: C++ Code that's Safe, Extensible, Efficient &amp; Easy to Use, PDF

Дмитрий Стародубцев, Ольга Кузьмичева — Практическое применение dev-контейнеров, PDF

Степан Дятковский — Почти полноценный RTTI с контролируемым overhead, PDF

Иван Афанасьев — Loop unrolling в деталях, PDF

Александр Ляпунов — Максимально быстрый и максимально удобный С++ msgpack-кодек

Марсель Галимуллин — Back to Basics: Lock-free, PDF

Алексей Степанов, Евгений Зуев — Исходный код: скрытое знание и как его показать?, PDF

Павел Новиков — Про flat_map, PDF

Антон Ласточкин — Мониторим FSM во встраиваемом ПО, PDF

Александр Бычук — Производство ПО глазами разработчика и менеджера, PDF

Константин Владимиров — Семантические процессы в C++

Александр Кирсанов — nocc — распределенный компилятор для гигантских проектов на C++, PDF

Евгений Ерохин — Back Deep to Basics: Наследование и виртуальность в C++ (Часть 1), PDF

Евгений Опарин — Опыт использования Bazel

Семен Буденков — С Conan за кроссплатформенностью, PDF

Сергей Талантов — С++ и безопасность: правда ли все так плохо?, PDF

Александр Боргардт — Колоночное хранилище в памяти: void* и шаблоны

Петр Советов — Автоматизация программирования в СССР. Трансляторы (60–70-е годы), PDF

Александр Корнилов — Идея по улучшению многопоточного кода, PDF

Александр Кухаренко — Демосцена: в погоне за wow-фактором, PDF

Виктор Шампаров — Компилятор LCC и оптимизация слияния кода, PDF

Евгений Зощук — Вперед в прошлое, или Разрабатываем фреймворк под Windows 95 в 2023 году, PDF

Михаил Лукин — Практика программирования тензорных ядер

Вадим Винник — Элементы функционального программирования в языке C++, PDF

Антон Соснин — С++ в мемах, PDF

Антон Полухин — C++ трюки из userver

Нужны ли профсоюзы в IT?

Тренды от HR

Интервью с Максимом Бабенко

Применимость и будущее С++(для подкаста)
2024-05-16 12:41 avovana

Добрый день, уважаемый форумчане!

Меня пригласил на подкаст мой товарищ поговорить про С++. Сам он когда-то разрабатывал на rust)
Хочу приобрести больше контекста по применимости С++ сегодня.

Подскажите, пожалуйста:
1) В какой доменной области работаете Вы с С++? Почему он там применяется? Какие задачи решаете?
2) Будет ли далее там использоваться С++?
3) Какое будушее у языка Вы видите, в целом?
4) Захватит ли всё rust?
5) Какие фишки обеспечивают С++ конкурентоспособность сейчас в вашем домене и будут обеспечивать в будущем?
6) Насколько в реальности сложен С++

Опрос для графиков, общих выводов:
https://forms.gle/YLVcvD4P5Q7vuin47

Заранее благодарен!

CppCon 2023 Presentation Materials
2024-05-14 05:54 LaptevVV

https://github.com/CppCon/CppCon2023/tree/main
Презентации.
Большая серия Back to Basic

Крутые доклады по С++ за 23 год
2024-05-04 07:50 LaptevVV

https://habr.com/ru/companies/pvs-studio/articles/811825/
Там Страуструп начинает
Есть Герб Саттер
Но есть и наши: Константинов, Полухин...

нужно ли декларировать виртуальный деструктор
2024-04-27 19:18 sergey2b

как вы считаете нужно ли декларировать виртуальный деструктор
в наследуемом классе, если он уже задекларирован в родители

с точки зрения хороших практик

порядок инициализации inline static const
2024-04-12 18:45 B0FEE664

В очередной раз пытаюсь написать перечисление с возможностью перебора элементов.
Возникает следующий вопрос:
в нижеприведённом коде вектор s_enum будет содержать значения в том же порядке, что они записаны в классе или же порядок не гарантируется?
class SeverityEnum
{
    public:
        using value_type = const char*;
    private:
        inline static std::vector<value_type>& RefValues()
        {
            static std::vector<value_type> s_enum;
            return s_enum;
        }
        inline static value_type EnumValue(const char* pStr)
        {
            value_type item{pStr};
            RefValues().push_back(item);
            return item;
        }
    public:
        inline static const value_type WARNING  = EnumValue("warning" );
        inline static const value_type MINOR    = EnumValue("minor"   );
        inline static const value_type MAJOR    = EnumValue("major"   );
        inline static const value_type CRITICAL = EnumValue("critical");
};

constexpr это рекомендация?
2024-04-11 10:58 00011011

В инете пишут что рекомендация компилятору сделать вычисление во время компиляции. Но если не получится — оставить на время выполнения.
Но зачем такое вообще нужно, если компилятор при оптимизации и так пытается вычислить что можно во время компиляции, а если не получается — генерирует код для времени выполнения?
consteval — понятно, строгое требование выполнить функцию во время компиляции и ошибка компиляции если не получается. А constexpr?

Функция, принимающая вложенный класс шаблонного класса.
2024-04-04 06:08 johny5

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

template<template<typename> typename T1, typename T2,
  template<typename> typename T3, typename T4>
void f(typename T1<T2>::T3<T4> val) {  }

template<typename T>
struct A
{
    template<typename S>
    struct B{};
};

int main() {
    f( A<int>::B<void>() );
}



Ошибки:

<source>:17:6: error: no matching function for call to 'f(A<int>::B<void>)'
17 | f( A<int>::B<void>() );
| ~^~~~~~~~~~~~~~~~~~~~~

<source>:7:6: note: candidate: 'template<template<class> class T1, class T2, template<class> class T3, class T4> void f(typename T1<T2>::T3<T4>)'
7 | void f(typename T1<T2>::T3<T4> val) { }
| ^

<source>:7:6: note: template argument deduction/substitution failed:

<source>:17:6: note: couldn't deduce template parameter 'template<class> class T1'
17 | f( A<int>::B<void>() );
| ~^~~~~~~~~~~~~~~~~~~~~


Убирая T3 полностью и заменяя его на явное B — помогает но это не то что нужно. Но и даже в этом случае приходится указывать все шаблонные параметры для вызова f() ручками, что нежелательно потому как весь смысл этой функции — это вывести все эти T1, .. T4 аргументы шаблона автоматически.

Цель работы — написать навороченный принтер типов, когда мы разваливаем входящий шаблон на запчасти, конвертируем в строку вложенные типы (через constexpr std::source_location::function_name()) и склеиваем всё это по какому-то шаблону, и всё в компайл-тайм.

С++ 20++.

cppmeta R&D compiler
2024-03-25 19:03 flаt

https://codereckons.com/articles

* An Informal introduction to CODE RECKONS CppMeta compiler
* Reflection use cases

Попробовать: https://cppmeta.codereckons.com

Множественный форвардинг в std::bind
2024-03-13 18:58 rg45

Привет, всем!

Споткнулся о прикольную багу фичу — множественный форвардинг (а значит, и множественное перемещение, иногда) внутри std::bind:

http://coliru.stacked-crooked.com/a/041bd611b4bd1924

#include <iostream>
#include <string>
#include <functional>

int main()
{
   using std::placeholders::_1;

   auto foo = [](auto a, auto b) { std::cout << "{ "<< a << ", " << b << " }" << std::endl; };

   auto f = std::bind(foo, _1, _1);

   f(std::string("Hello")); // -> { , Hello }
}


Почему так сделано — это понятно. Но ошибку искал часа полтора. Так что, будьте осмотрительны, остерегайтесь выходить на болота в ночное время ну, в общем, вы поняли.

50 ссылок по С++
2024-03-10 15:27 LaptevVV

https://www.mycplus.com/featured-articles/50-c-cpp-source-code-websites/
Ветераны, наверное, знают большинство из них.
Но иногда попадаются, где я не был.

llvm 18.1.0
2024-03-06 22:24 reversecode

https://github.com/llvm/llvm-project/releases/tag/llvmorg-18.1.0
тутачки клангчик за релизили
ну за релизили и черт с ним, скажете вы
между версии они каждые две недели клепают
но есть реализация фишки с с++26

https://releases.llvm.org/18.1.0/tools/clang/docs/ReleaseNotes.html#c-2c-feature-support

struct S {
int _, _; // Was invalid, now OK
};
void func() {
int _, _; // Was invalid, now OK
}
void other() {
int _; // Previously diagnosed under -Wunused, no longer diagnosed
}

вкусно же, не нужно придумывать всякие reserved имена переменным

есть еще P0847R7: Deducing this для C++23
но мне он как то не зашел, не вижу пока применения

Так С++23 уже утвержден или нет ?
2024-03-06 06:33 LaptevVV

Если утвержден, то где взять последний драфт ?
И сорока на хвосте принесла, что asio принята в качестве стандартной сетевой библиотеки.
Это в С++23 или в С++26 ?

Не могу понять прикола
2024-03-05 14:20 K13

код: https://coliru.stacked-crooked.com/a/053394d0fc0b2cdb

каким-то образом при наличии НЕшаблонного operator|() для конкретного enum
он перестает его видеть если в неймспейсе A добавить шаблонный оператор|() который всегда отключен.

Что-то я торможу. Не понимаю, что происходит при смене #if 1 / #if 0

концепты как параметры шаблонов
2024-03-04 01:38 rg45

Постояно ловлю себя на мысли, что мне ужасно не хватает этой возможности — передать концепт параметром в какой-нибудь шаблон.

А прикиньте, как было бы классно:

template <typename T, template <typename> concept C>
concept RangeOf = std::ranges::range<T> && C<std::ranges::range_value_t<T>>;

void foo(RangeOf<std::convertible_to<double>> auto&& r) { /* . . . */ }

Современные компиляторы и NRVO
2024-03-01 19:22 _NN_

Насколько вы полагаетесь на оптимизацию компилятора ?

Скажем даже MSVC подтянулся с оптимизацией: MSVC Improving Copy and Move Elision.
Однако, стандарт не гарантирует нам отсутствие копирования в отличии от гарантий временного объекта.

В идеале хотелось бы проверку на этапе компиляции в отсутствии копирования.
С другой стороны, можно всегда приводить к rvalue и получить гарантировано отсутствие копирования, правда с гарантированным перемещением, которого не будет в случае NRVO.

struct MyType { ... };

MyType might_copy() {
 MyType m;
 // много-много кода
 return m;
}

MyType always_move() {
 MyType m;
 // много-много кода
 return std::move(m);
}