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
Т.е. диапазоны перекрываются, но так как src больше чем dst, поэтому я думал проблем ну будет.
Но вышла проблема, причём самое интересное, что проявляется переодически.
Заметил, что когда dst заканчивает на B0,С0,D0 проблема есть. Т.е. 3 из 16 раз.
Пытался посмотреть исходники memcpy, понял что он копирует вперёд (т.е. увеличивая поинтеры), но возможно кусочек начала копирует в конце поэтому и проблема,
но я не понял почему оно зависит от адреса dst.
Вопрос по итераторам
2024-05-23 09:47 LaptevVV
код функции
// -- работает с другим размером
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
На данный момент на канале конференции доступны следующие видео (если к докладу прилагались слайды, то рядом приведена и ссылка на 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 & 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
Крутые доклады по С++ за 23 год
2024-05-04 07:50 LaptevVV
Там Страуструп начинает
Есть Герб Саттер
Но есть и наши: Константинов, Полухин...
нужно ли декларировать виртуальный деструктор
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
* An Informal introduction to CODE RECKONS CppMeta compiler
* Reflection use cases
Попробовать: https://cppmeta.codereckons.com
Множественный форвардинг в std::bind
2024-03-13 18:58 rg45
Споткнулся о прикольную
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
Ветераны, наверное, знают большинство из них.
Но иногда попадаются, где я не был.
llvm 18.1.0
2024-03-06 22:24 reversecode
тутачки клангчик за релизили
ну за релизили и черт с ним, скажете вы
между версии они каждые две недели клепают
но есть реализация фишки с с++26
https://releases.llvm.org/18.1.0/tools/clang/docs/ReleaseNotes.html#c-2c-feature-support
вкусно же, не нужно придумывать всякие reserved имена переменнымstruct S {
int _, _; // Was invalid, now OK
};
void func() {
int _, _; // Was invalid, now OK
}
void other() {
int _; // Previously diagnosed under -Wunused, no longer diagnosed
}
есть еще P0847R7: Deducing this для C++23
но мне он как то не зашел, не вижу пока применения
Так С++23 уже утвержден или нет ?
2024-03-06 06:33 LaptevVV
И сорока на хвосте принесла, что asio принята в качестве стандартной сетевой библиотеки.
Это в С++23 или в С++26 ?
Не могу понять прикола
2024-03-05 14:20 K13
каким-то образом при наличии НЕшаблонного 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);
}