Задать вопрос
  • Данные в таком случае будут хранится в стеке?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В наше время можно просто проверить: godbolt.org

    И clang и g++ и при локальном и при глобальном объявлении кладут 1 на стек.
    Правда, clang чуть поумнее и выдает warning:
    warning: temporary whose address is used as value of local variable 'Number' will be destroyed at the end of the full-expression [-Wdangling]


    Нельзя надеяться, что по этому адресу останется лежать 1. В более сложных случаях этот адрес может быть переиспользован под что-то еще. Обращение по такому указателю - UB.
    Ответ написан
    Комментировать
  • Данные в таком случае будут хранится в стеке?

    @Mercury13
    Программист на «си с крестами» и не только
    Не пиши так, пожалуйста.
    Перед нами продление жизни временного объекта.
    Когда ссылка исчезнет — а она исчезнет после точки с запятой — указатель будет смотреть в никуда, и только от Ктулху зависит, когда переменную перезапишут.
    Правильно так:
    const int& ref = 1;
    const int* Number = &ref;

    Данные могут лежать где угодно — теоретически на стеке, но оптимизатор может перекинуть их и в сегмент данных.

    В общем, правило. Продлённый объект живёт, пока живёт та ссылка, что его продлила. Ссылки и указатели, что сделаны уже из этой ссылки, не в счёт: Си++ всё-таки не «мусорный» язык. Временный объект живёт до точки с запятой, за исключением нескольких случаев: явная команда придержать объект (о которой у нас и речь), создание/копирование массива (для простоты компиляции и чтобы не раздувать стек), с Си++23 в команде «цикл по объекту» ради безопасности и предсказуемости.
    Ответ написан
    Комментировать
  • Куда поместить рендер? Где он обычно расположен?

    GavriKos
    @GavriKos Куратор тега Разработка игр
    Как рендер реализован например в игровых движках

    Используется одно окно, которое сразу фуллскрин.
    Ни разу не видел игр с несколькими окнами.

    1) Принимать рендер в конструкторе.
    Только одна проблема надо для каждого объекта передавать этот рендер. Что не хочется и выглядит как то не очень.

    Нормально выглядит. DI через конструктор.
    Ответ написан
    1 комментарий
  • Нормально ли создавать пустую вирутуальную функцию?

    @Mercury13
    Программист на «си с крестами» и не только
    ВСЕ ПРИМЕРЫ ЖИВЫЕ, у меня перед глазами.
    • stream.flush — физический сброс данных на устройство (при выводе) или сброс буферов (при вводе) имеет место только с реальным устройством, а написанные прикладным прогером потоки редко с ними работают, потому пустая.
    • Импортёр из системы управления предприятием, который для каждого, например, рецепта производства вызывает callback. Если рецепты не поддерживаются — ничего не делать.
    • В каком-то виджете Qt напрочь убираем реакцию на колесо мыши.
    • Программа использует для ускорения кучу кэшей, которые перед импортом данных выкидываются. Если выкидывать нечего — функция compactMemory пуста.
    • Или твоя фигура-квадрат, для которой поворот ничего не делает.
    Ответ написан
    Комментировать
  • Почему нельзя использовать private метод в качестве аргумента для алгоритмов в другом private методе?

    @code_panik
    В комментарии Wataru уже указал на вероятную проблему. Метод класса первым аргументом принимает указатель this на объект класса, который этот метод вызывает. То есть вызов objectName.foo(100) компилируется в нечто такое foo(&objectName, 100).
    Только вместо std::bind проще использовать лямбду. Если в списке захвата лямбды указать this или =, то всеми видимыми методами класса в лямбде можно пользоваться как обычно, https://godbolt.org/z/e9z76vTY7.
    #include <array>
    #include <algorithm>
    #include <functional>
    #include <iostream>
    
    class Container {
    public:
        bool isZeroLambda() {
            return std::ranges::all_of(std::begin(ar), std::end(ar),
                    [this](auto x) { return isZeroValue(x); });
        }
    
        bool isZeroBind() {
            auto pred = std::bind(&Container::isZeroValue, this, std::placeholders::_1);
            return std::ranges::all_of(std::begin(ar), std::end(ar), pred);
        }
    
    private:
        bool isZeroValue(int x) { return x == 0; }
        std::array<int, 3> ar{};
    };
    
    int main() {
        Container c;
        std::cout << c.isZeroLambda()
            << '\n' << c.isZeroBind();
        return 0;
    }
    Ответ написан
    Комментировать
  • Баг цикла или как это объяснить?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Подсказка: вот то число, что у вас в конце выводится - это 2^64-1. Еще подсказка: size_t на современных платформах имеет размер 64 бита.

    У вас переполнение. Вы там из 0 вычитаете 1 в итерации цикла, получаете самое большое число, представимое в 64-битном типе.

    Надо переписать цикл на while и делать из него break по достижению 0. Или тип переменной сменить на знаковый.
    Ответ написан
    Комментировать
  • Лучше ли использовать enum для цвета нежели struct?

    @res2001
    Developer, ex-admin
    Как я понимаю через выше aligment тем лучше?

    Нет. Это бред. Тут не применимы термины лучше/хуже.

    Alignment (выравнивание) - это просто свойство типа данных.
    enum по умолчанию имеет тип int, соответственно и все его свойства наследуются. В С++ (с версии 17, если не ошибоаюсь) можно самому выбрать тип enum. Для выравнивания обычно действует простое правило - тип должен быть выровнен в памяти на границу кратную его размеру. Например у int размер 4 байта (обычно), и выравнивание должно быть по границе 4 байт. у char/uint8_t - размер 1 байт, соответственно ограничений по выравниванию нет, т.е. выравнивание по границе байта. Тип SDL_Color - это, видимо, структура, состоящая из 4 uint8_t (или что там в SDL используют для unsigned char), выравнивание для структуры берется из типа ее первого поля (если аттрибутами не задано другое).
    Используй типизированный в uint8_t enum и будет тебе счастье.
    https://en.cppreference.com/w/cpp/language/enum

    Кстати, выравнивание, это не ограничение С++ - это ограничение процессора на аппаратном уровне. Правда почти все современные процессоры уже не имеют этого ограничения и нормально жуют не выровненные типы, но при этом операции выполняют медленнее, чем с выровненными. Фактически процы просто научились "маскировать" это ограничение. Поэтому ограничение в языке осталось.
    К тому же все еще есть процессоры, где требование выравнивания действует, но это в основном что-то из разряда микроконтроллеров. На таких процессорах использование не выровненных типов приводит к ошибке шины и вылету программы.
    Обычно тебе не нужно думать про выравнивание, т.к. компилятор об этом позаботится за тебя. Но бывают ситуации, когда программист должен это учитывать. Например когда ты читаешь поток бинарных данных из сети или из файла, и данные в потоке - это что-то сложнее, чем байты и символы.
    Ответ написан
    1 комментарий
  • Лучше ли использовать enum для цвета нежели struct?

    CityCat4
    @CityCat4 Куратор тега C
    Дома с переломом ноги
    Вообще говоря, вкусовщина. align 4 означает выравнивание на границу слова, если там данных один байт, три пропадает. align 1 - никакого выравнивания, данные идут друг за другом. Но эффект (в виде разницы в требовании памяти) будет проявляться только при большом количестве обьектов данного типа (миллионы единиц).
    Ответ написан
    Комментировать
  • Лучше ли использовать enum для цвета нежели struct?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Без разницы. Используйте то, что логичнее смотрится в коде. Разницу в производительности, во-первых, вы получите лишь в очень специфичных случаях (при передаче в функцию enum скорее всего окажется в регистре, а вот структура полезет на стек. В итоге enum окажется быстрее), во-вторых, только если читать вы будете миллионы стркутур. И то, вам должно не повезсти с кешем процессора и префетчером.

    Так что париться вот тут о производительности не стоит. Ваша интуиция скорее всего не верна. Выбор должен быть с точки зрения дизайна и читабельности кода, а не вот этой вот оптимизации.
    Ответ написан
    Комментировать
  • Как сделать чтобы flex box сжимался при уменьшении масштаба?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    .layout {
        width: 1660px;
    +   max-width: 100%;
        position: relative;
        display: flex;
        flex-direction: column;
        justify-content: flex-start;
        align-items: stretch;
        row-gap: 100px;
        margin: auto;
    }

    .layout {
    -   width: 1660px;
    +   width: 100%;
    +   max-width: 1660px;
        position: relative;
        display: flex;
        flex-direction: column;
        justify-content: flex-start;
        align-items: stretch;
        row-gap: 100px;
        margin: auto;
    }
    Ответ написан
    Комментировать
  • Как правильно расчитать усиление по напряжению в схеме с NPN ОЭ?

    @nehrung
    Не забывайте кликать кнопку "Отметить решением"!
    Теория ваша верная, но отношение R3/R4 - не 3,6 (откуда вы взяли эту цифру?), а 7,5. Чтобы уточнить, надо учесть параллельное соединение сопротивления 560 Ом и сопр. нагрузки 5,1 кОм, с учётом емкостного сопротивления конденсатора.
    Реактивное сопротивление 3,9 мкФ на частоте 20 Гц - 2 кОм. Комплексное сопротивление нагрузочной цепи будет примерно 5,4 кОм. В параллель с 560 Ом нагрузка получается 507 Ом. Соответственно уточнённое значение коэфф. усиления транзистора 507 / 75 = 6,8. Но опять-таки никак не 3,6!
    Ну, а потери во входной цепи, снижающие общий коэфф. передачи, попробуйте прикинуть самостоятельно. Подкину вам только реактивное сопротивление для конденсатора 8,2 мкФ на частоте 20 Гц - 970 Ом.
    Ответ написан
    4 комментария
  • Как расчитать падение напряжения на переходе коллектор-эмиттер?

    @VT100
    Embedded hardware & software.
    Транзистор будет открыт и, может быть, даже насыщен.
    На базе - будет 0,6-0,7 В относительно эмиттера. Отсюда - считам ток базы. Это ток через верхний резистор 110 кОм минус ток через нижний резистор 110 кОм. По току базы - считаем ток коллектора, принимая средний коэффициент передачи тока 150. По току коллектора - считаем падение напряжения на резисторе 1 кОм. Отсюда до напряжения коллектор-эмиттер - рукой подать.
    P.S. Перехода коллектор-эмиттер - нет в природе.
    Ответ написан
    1 комментарий
  • Можно ли как-то получить доступ к отображающим элементам ToolBar?

    WNeZRoS
    @WNeZRoS
    требуется подсвечивать текущий элемент

    с помощью события нажания


    Лучше не делать таких не явных предположений о текущем элементе, кнопка может быть нажата, но из-за каких-то внутренних условий "текущесть" может не измениться.
    Лучше завести во вью модели флаг о том что он текущий и по нему подсвечивать. Проще всего в той же, для которой ItemTemplate с кнопкой написан.

    Но если хочется более чистого кода, то можно через RelativeSource вылезти во внешнюю вью модель и сделать проверку через мультибининг с конвертером
    <MultiBinding Converter="{StaticResource IsEqualsConverter}">
        <Binding />
        <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type ToolBar}}" Path="DataContext.CurrentElement" />
    </MultiBinding>


    Если вдруг под подсветить вы имеете в виде не что-то своё хитрое, а фокус, то можно использовать экстеншен с attached dependency property для установки фокуса. В этом случае для определения первого элемента поможет {RelativeSource Mode=PreviousData} - у первого элемента он будет {x:Null}
    Ответ написан
    Комментировать
  • Важно ли кодировать состояния, входы и выхода КА с 0?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Абсолютно неважно. Вы их вообще можете обозначить буквами или эмодзи. Суть автомата от этого не поменяется.
    656d851fd6c48284862906.png
    Ответ написан
    Комментировать
  • Почему нельзя использовать std::function как аргумет шаблонной функции?

    @dima20155
    you don't choose c++. It chooses you
    Потому что lambda != std::functional
    Пример:
    https://godbolt.org/z/YrKc8q5q7

    https://stackoverflow.com/questions/11774277/lambd....
    Ответ написан
    Комментировать
  • Почему нельзя использовать std::function как аргумет шаблонной функции?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Потому что лямбда не ялвяется std::function. Компилятор, вообще говоря, может лямбду привести к типу std::function, но не в вашем случае. Вам надо, например, самим преобразовать лямбду в std::function:
    std::function<bool(int, int)> comp = [](int left, int right)
      {
        return left < right;
      };
      Sort(vec, comp);


    Сам компилятор тут это сделать не может, потому что ему тип к которму приводить-то неизвестен - он зависит от параметра шаблона T.

    Можно, еще, например, указать компилятору параметры шаблона, тогда все скомпилируется:
    Sort<int>(vec, [](int left, int right)
      {
        return left < right;
      });


    Но лучший вариант - не использовать std::function в шаблоне. Просто используйте какой-то typename U, у которого вы продполагаете существует operator(int, int). Если туда передать не function и не лябмду, оно не скомпилится:

    template <typename T, typename U>
    void Sort(std::vector<T>& vector, U comparison) {
        // Используете comparison, как-будто это std::function:
        if (comparison(1, 1)) return;
    };
    
    
    int main()
    {
      std::vector<int> vec = { 1, 2, 3, 4, 5, 7, 6, 9 ,8 };
    
      Sort(vec, [](int left, int right) -> bool
      {
        return left < right;
      });
        return 0;
    }
    Ответ написан
    Комментировать
  • Почему умножение матрицы 8x8 медленнее чем 10x10?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Скорее всего тут дело в кеше процессора. После первых запусков так получилось, что данные оказались в кеше.

    Вообще, писать бенчмарки - очень сложно. Надо сначала прогонять тест несколько раз и отбрасывать результаты, а уже потом мерять. Надо быть очень внимательным, если вы запускакте разные тесты в одной программе подряд: результаты работы одного теста могут повлиять на остальные.

    Ну и главное, выполнять такое короткое действие всего один раз - это вообще моветон. Надо выполнить его сотню тысяч раз и потом общее время делить на количество запусков. Иначе вы меряете случайный шум в основном. Может тут вам просто все время (не)везет и вот так третий тест оказывается быстрее остальных.
    Ответ написан
    3 комментария
  • Можно скрыть "замочки" в solution explorer у файлов?

    @GLeBaTi
    Только если отключить git в visual studio (Tools-Source Control-Plug-in Selection). Отдельно никак
    Ответ написан
  • Ошибка: for требуется объявление. Как исправить?

    @Acaunt
    Для начала просто убери цикл в классе. Циклы не вставляют прямо в класс, а вставляют в методы.
    Ответ написан
    3 комментария
  • Реализую свойства, но почему у string требует перегрузку для cout?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Ну, у вас person.Age - это Property<int>. Как его в cout выводить вы нигде не определяли, про это компилятор и ругается. У Property вы, правда, определили приведение к int. так-что вот это сработает:
    cout << static_cast<int>(person.Age);

    Но сам компилятор догадаться, что это надо к инту приводить не может.

    Вам надо также, как вы operator<< для Person определили, определить его для Property<T>.
    Ответ написан
    3 комментария