Russian Qt Forum
Апрель 26, 2024, 00:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 2 [3] 4 5 ... 217
31  Программирование / С/C++ / Re: Layout groupBox : Май 12, 2021, 16:40
Работаете в дизайнере? Если да, то надо не виджеты объединять в лайаут (точнее это тоже можно но для другого), а жамкнуть правой кнопкой по родительскому виджету (форме) и задать лайаут ей. Или кнопкой на тулбар воспользоваться выделив оный виджет
32  Программирование / С/C++ / Re: чтение и запись битовых структур данных : Май 10, 2021, 11:16
Может быть. Но гонять (большие) структуры сырые<->рабочие - мало не покажется, считаю оно того стоит.


Это называется "абстракция". Завтра вам надо другой формат поддерживать - удачи менять все структуры.
На самом деле такие "битовые" операции даже в моей текущей области (спутники) нужны (правда тут тупо кодом все читается, без декларативных структур) и вот у вас условно 10 похожих но разных форматов расположения битовых полей. Условно идет Хедер1 по которому мы понимаем идет ли дальше Хедер2А или Хедер2Б. В итоге всё это льется в огромный объект с кучей свойств - в зависимости от какие-то свойства есть, каких-то нет. Причем одни и те же свойства в разных вариантах на разной битовой позиции, ох я бы не хотел работать с битовыми структурами напрямую
33  Программирование / С/C++ / Re: чтение и запись битовых структур данных : Апрель 27, 2021, 13:15

Это не то, чтобы "в с/с++ это предусмотрено и так нужно делать", это безопасный лайфхак. Если размер битовой структры 64 бита, и объединённого члена 64 бита, то компилятор не то что не позволит это сделать, или что-то испортит - а куда он денется с подводной лодки?

все ненавистное UB нужно для оптимизаций.
Можно тот пример с reinterpret_cast переписать на union:

Код:
union U {
    int i{0};
    float f{0};
};

int foo()
{
        U u;
u.i = -1;
u.f = 0.0f;

return u.i; // 0 или -1?
}
34  Программирование / С/C++ / Re: чтение и запись битовых структур данных : Апрель 27, 2021, 12:49
Писать в одно поле юниона, а читать из другово (в моих примерах) законно в любом языке. То, о чем говориться по вашей ссылке к моему случаю не имеет отношения.

Нет, не законно=) Это опять возвращает нас к разговору о reinterpret_cast и type punning.
Единственный законный способ сделать type punning в современном с++ - это memcpy.
В с++20 добавят bit_cast который сейчас можно написать самому через memcpy

Код:
template <class To, class From>
typename std::enable_if_t<
    sizeof(To) == sizeof(From) &&
    std::is_trivially_copyable_v<From> &&
    std::is_trivially_copyable_v<To>,
    To>
// constexpr support needs compiler magic
bit_cast(const From& src) noexcept
{
    static_assert(std::is_trivially_constructible_v<To>,
        "This implementation additionally requires destination type to be trivially constructible");
 
    To dst;
    std::memcpy(&dst, &src, sizeof(To));
    return dst;
}

То есть можно скопировать буфер в структуру через memcpy а вот записать int64_t а потом прочитать из битфилда на него наложеннный - нет.
Но да, все известные мне компиляторы это позволяют делать. Но clang-tidy ругается AFAIK
35  Программирование / С/C++ / Re: Итераторы : Апрель 22, 2021, 11:26
с 50% вероятностью ответ нет
36  Программирование / С/C++ / Re: Итераторы : Апрель 22, 2021, 11:02

So ?

Код:
void doWork(const CData &data)
{
}

template<typename С>
void iterateContainer(const С& c)
{
    for (const auto &item: c)
    {
        if constexpr (std::is_pointer_v<C::value_type>)
            doWork(*item);
        else
            doWork(item);
    }
}
37  Программирование / С/C++ / Re: Итераторы : Апрель 22, 2021, 10:55
Если в b() генерируется исключение, то в потоке должен остаться результат от a(). А теперь посмотрите что кодогенерит gcc до 7. Улыбающийся

Ну да, но это с с++11, на тот момент задача была валидная. Я таки носили простыню про sequencing, пункт 19 https://en.cppreference.com/w/cpp/language/eval_order
Но надо понимать что это поправили только для operator<< и >>, для operator+ порядок по-прежнему не задан.
38  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 17:11
у вас в обоих случаях 10.3 (см правый pane)
39  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 17:00
Даже в вашем варианте порядок вызовов четко определен. Улыбающийся

Ну вот gcc 4.6 печатает "210", а 10.3 печатает "120" https://godbolt.org/z/Pc9fa4bf9
Там в целом были какие-то изменения в с++11, но яхз, поправлено это или "везет" что все новые компиляторы печатают одинаково.

Что вначале выполниться boo или f? Улыбающийся

вот только оператор (даже член класса) это функция от двух аргументов
Код:
foo(f(), g());
не понимаю почему функция-член класса гарантирует что "this" вычисляется первым. где это написано?
40  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 15:15

Нужно было вспомнить, что эта запись сахар для такой Улыбающийся
Код
C++ (Qt)
std::cout.operator<<( f() ).operator<<( f() ).operator<<( f() ).operator<<( std::endl );
 


Да, но нет, это не члены класса а свободные функции:

Код
C++ (Qt)
operator<<(operator<<(operator<<(operator<<( std::cout, f() ), f() ),  f() ), std::endl );
 
и что выполнится вначале - operator<<( std::cout, f() ) или f() - бабка надвое сказала
41  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 12:03
Любая задача имеет по меньшей мере одно решение: снятие самой задачи/проблемы. Здесь оно и будет лучшим - не нужны такие заморочки.

Ну там задачи были разной сложности что позволяло оценить уровень кандидата. Полезно иметь задачу с подвохом ультимативной сложности. Если человек скажет какой-то один из возможных вариантов, то норм (там еще надо продраться сквозь код же), а если про точки следования вспомнит - ваще бох. Правда на моей памяти никто без подсказок не вспомнил, но это и не особо влияло.
42  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 11:52
И как вы предполагали - какой Rand будет вызван первым - левый или правый?

В 2ГИСе мы спрашивали похожую задачку
std::cout << f() << f() << f() << std::endl;

где f() имеет сайд-эффект (делает i++)

никто не решил (я в том числе)
43  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 11:47
Вот этот код дает UB (печатает -1 вместо ожидаемого 0) в обоих случаях (MinGW 8.3, O2):

Да, прикольно, не задумывался о том что placement new можно звать на unrelated типах.
Небось тоже где-то прописано что так делать нельзя (кроме char*/void*)
44  Программирование / С/C++ / Re: Итераторы : Апрель 20, 2021, 16:03
Ах, таки вы меня подсекли! Про возможную специализацию внешнего типа я упустил. В данном случае специализации QSet нет, работать будет. Но в общем случае - да, это нужно учитывать.

Там внутри могут быть всякие traits которые для разных типов разные.
Но в любом случае, даже если битовое представление одинаковое, это UB.

По поводу strict alias rule и оптимизации (привет restrict poiners): А как вы соотнесете это с placement new(), например?

В чем проблема-то? Единственный валидный юзкейз reinterpret_cast между разными типами это каст к массиву байт (или void*) и обратно.
Компилятор знает что вон тот char buffer[] потенциально может алиаситься с вот этим указателем и сгенерит менее производительный код.
placement new как раз подпадает под это - буфер чаров может алиаситься (и делает это) с указателем на произвольный T.
А вот любые другие типы (например int* в double*) алиаситься не могут.
45  Программирование / С/C++ / Re: Итераторы : Апрель 20, 2021, 15:09
Ну или более сложный пример, вы знаете что на вашей платформе sizeof(bool) == sizeof(int8_t) (ну или char).
Значит вы можете сделать
Код:
vector<bool> bools;
auto &chars = reinterpret_cast<vector<char>&>(bools);
?
Страниц: 1 2 [3] 4 5 ... 217

Страница сгенерирована за 0.095 секунд. Запросов: 23.