Просмотр сообщений
|
Страниц: 1 2 3 [4] 5 6 ... 290
|
46
|
Программирование / С/C++ / Re: Итераторы
|
: Апрель 25, 2021, 09:02
|
И тот reinterpret_cast, нафиг он нужен? Тем более memcpy. Да просто так C++ (Qt) using CDataRef = std::reference_wrapper<CData>; QSet<CDataRef>& SelectionAsRefs( void ) { static_assert(sizeof(CData*) == sizeof(CDataRef)); return *(QSet<CDataRef> *) &mSelection; }
И вся любовь. Точно. А придурки из комитета все какие то касты придумывают, то static_cast, то reinterpret_cast, сейчас bit_cast придумали. Нечем им заняться. Зачем? Если можно сишным кастануть и вся любовь.
|
|
|
47
|
Программирование / С/C++ / Re: чтение и запись битовых структур данных
|
: Апрель 24, 2021, 11:41
|
А вообще тема конечно обширная. Все зависит от того, что вы хотите: если вам нужны только pack/unpack - это будет одно решение. Если вы хотите хранить такие структуры в памяти и работать с ними из бизнес-логики, то другое. Для примера: C++ (Qt) // Схемы пакетов auto ShemaPacket1 = std::make_tuple( 3, 3, 10, 52 ); auto ShemaPacket2 = std::make_tuple( 9, 11, 37, 60, 1, 1 ); // Возвращает упакованный bit_array auto bits1 = pack( ShemaPacket1, 1, 2, 8, 1024 ); auto bits2 = pack( ShemaPacket1, data.val1, data.val2, data.val3, data.val4 ); auto bits3 = pack( ShemaPacket2, 15, 0, 0, 1024, 1, 0 ); // Возвращает кортеж значений по указанной схеме или exception auto result1 = unpack( bits1, ShemaPacket1 ) auto [val1, val2, val3, val4] = unpack( bits1, ShemaPacket1 ) auto result3 = unpack( bits3, ShemaPacket2 )
|
|
|
49
|
Программирование / С/C++ / Re: Итераторы
|
: Апрель 23, 2021, 15:21
|
Угрызения совести Все-таки это говнокод Я на это смотрю и думаю: Да, этому парню говнокод не предложишь. C++ (Qt) void CBigClass::SomeMethod( bool useSelection ) { .. int limit = useSelection ? mSelection.size() : mData.size(); auto dataIt = mData.begin(); auto selIt = mSelection.begin(); for (int i = 0; i < limit; ++i) { CData * dataPtr; if (useSelection) { dataPtr = *selIt; ++selIt; } else { dataPtr = &(*dataIt); ++dataIt; } ... } }
|
|
|
50
|
Программирование / С/C++ / Re: Итераторы
|
: Апрель 23, 2021, 09:18
|
Что же нового/современного можно использовать? (вместо структур > 10 летней давности).
Для того, что бы появились новые структуры данных, эти новые структуры сначала должен кто-то придумать. Т.к. от std-шников ждать ничего не приходится, то остаетесь только вы. А как придумаете, то std-шники сразу эти новые структуры реализуют в своем убогом std.
|
|
|
51
|
Программирование / С/C++ / Re: Итераторы
|
: Апрель 22, 2021, 07:28
|
А насколько вообще хорош (правомерен и.т.п.) такой выбор контейнеров?
Он великолепен. Основная ваша проблема в этом: (как и делать из тела метод)
Как только вы сделаете отдельный метод, все у вас начнет получаться.
|
|
|
52
|
Программирование / С/C++ / Re: Итераторы
|
: Апрель 22, 2021, 07:02
|
Там в целом были какие-то изменения в с++11, но яхз, поправлено это или "везет" что все новые компиляторы печатают одинаково.
Конечно поправили, gcc до 7 генерировал неправильный код. В случае с стримами порядок вызовов функций четко определен. C++ (Qt) std::cout << a() << b() << c() << std::endl;
Если в b() генерируется исключение, то в потоке должен остаться результат от a(). А теперь посмотрите что кодогенерит gcc до 7.
|
|
|
53
|
Программирование / С/C++ / Re: Итераторы
|
: Апрель 21, 2021, 17:56
|
И в чём проблема? Это пайплайн. Он должен выполняться строго слева направо (ибо в этом его суть) и никак иначе. Сайд-эффект в чём?
В том, что gcc до 7.1 лажал и генерировал шляпу.
|
|
|
54
|
Программирование / С/C++ / Re: Итераторы
|
: Апрель 21, 2021, 17:22
|
Да, жесть. Нужно быть осторожным. За такое, конечно нужно яйца откручивать gcc-шникам. Спасибо хоть gcc с 7.1 начал нормальный код генерить.
|
|
|
55
|
Программирование / С/C++ / Re: Итераторы
|
: Апрель 21, 2021, 17:09
|
Вот два скрина, в обоих случаях вроде 012?Увидел где 210. вот только оператор (даже член класса) это функция от двух аргументов не понимаю почему функция-член класса гарантирует что "this" вычисляется первым. где это написано? Ну и что, что два аргумента. В этом операторе нам не важно, какая функция будет выполнена первой operator<<( this(), f() )
|
|
|
56
|
Программирование / С/C++ / Re: Итераторы
|
: Апрель 21, 2021, 16:37
|
Кстати, при прочих равных (когда нет выделения общих вычислений на аргументах) на практике соглашение о вызове по идее должно коррелировать с порядком вычисления аргументов - тот, который пушим первым первым и вычисляем, но не вычисляем первым аргумент из середины, т.к. его нельзя сразу запушить. Но, например, при register calling convension то, что будет передаваться в регистрах можно вычислять в любом порядке. Так что вариаций много.
Как я помню, это отдается на откуп компилятора. Поэтому может быть что угодно, закладываться на это нельзя.
|
|
|
57
|
Программирование / С/C++ / Re: Итераторы
|
: Апрель 21, 2021, 15:23
|
Вспомнилось что когда-то весьма усердно изучалось нечто вроде Pascal передает параметры слева направо, стек очищает сама ф-ция. А вот С - справа налево и стек очищает вызывающий. Поэтому можно передавать переменное число параметров и.т.д и.т.п. (потом еще для калбэков надо было учитывать) Ну может какой-то смысл в этом и есть, но в принципе это совершенно бесполезное забивание головы всякой фигней Да-да, продолжайте наблюдение.
|
|
|
58
|
Программирование / С/C++ / Re: Итераторы
|
: Апрель 21, 2021, 15:22
|
Да, но нет, это не члены класса а свободные функции:
А у какого компилятора operator<< это свободная функция? У gcc и clang это члены класса. Даже у msvc это член класса. и что выполнится вначале - operator<<( std::cout, f() ) или f() - бабка надвое сказала
Что вначале выполниться boo или f? C++ (Qt) boo( f() );
а здесь: C++ (Qt) auto &os1 = std::cout.operator<<( f() ); auto &os2 = os1.operator<<( f() ); auto &os3 = os2.operator<<( f() ); auto &os4 = os3.operator<<( std::endl );
Даже в вашем варианте порядок вызовов четко определен.
|
|
|
59
|
Программирование / С/C++ / Re: Итераторы
|
: Апрель 21, 2021, 13:31
|
В 2ГИСе мы спрашивали похожую задачку std::cout << f() << f() << f() << std::endl;
где f() имеет сайд-эффект (делает i++)
никто не решил (я в том числе)
Нужно было вспомнить, что эта запись сахар для такой C++ (Qt) std::cout.operator<<( f() ).operator<<( f() ).operator<<( f() ).operator<<( std::endl );
А они всегда выполняются слева направо, т.к. здесь следующий оператор всегда применяется к результату предыдущего. А вот с boo( f(), f(), f() ), не все так однозначно и, если мне не изменяет память, это отдается на откуп компилятора. Как правило f() будет вызываться справа налево, по крайней мере я не знаю ни одного компилятора, у которого это не так.
|
|
|
60
|
Программирование / С/C++ / Re: Итераторы
|
: Апрель 21, 2021, 11:28
|
Вообще употребляемые здесь слова "продакшн", "разработка" и.т.п. - это просто "надувание щек", здесь обсуждается всего лишь мелкая деталь Боже, от вас слышать про надувание щек...
|
|
|
|
|