Ссылка
От: CEMb  
Дата: 06.12.23 11:11
Оценка:
Всем привет
Тема про realtime и быстродействие.

Подозреваю, есть простое решение, может через boost или ещё проще.
Есть примерно такой класс

class Device;
class Object
{

private:
    std::unique_ptr<Device> device_{};

    const float& reloadTime_; // условно, это ссылка, по которой вопрос
};



Допустим, у объекта Object в некоторый момент инициализируется переменная device_, у девайса есть время перезагрузки, которое можно из него получить методами. И, например, у него есть метод, который возвращает const-ссылку на свою внутреннюю переменную float reloadTime_;

Если бы после создания device_ я мог бы проинициализировать Object::reloadTime_, то в коде мне было бы проще обращаться к ней, чем писать каждый раз device_->GetReloadTime(); с условием, что device_ уже проинициализирован.
В случае, если device_ не создан, я могу в конструкторе reloadTime_ проинициализировать какой-то статической переменной. Но я не могу переинициализировать ссылку после создания device_.

Чего хочется:
1. Удобства в коде. Поэтому любые другие идеи приветствуются тоже!
2. Оптимизации. Но даже с GetReloadTime() проблем бы не было: компилятор туда ровно ту же ссылку на переменную Device::reloadTime_ поставит. Единственный момент тут — это проверка, что device_ не nullptr. Таких объектов как reloadTime_ может быть много, и они активно используются в логике. Хотелось бы не добавлять условия, если есть возможность это не делать.
Re: Ссылка
От: reversecode google
Дата: 06.12.23 11:47
Оценка: 6 (1)
ничего не понял
можно std::optional<float> reloadTime_
ну или вместо ссылки указатель юзайте
Re: Ссылка
От: so5team https://stiffstream.com
Дата: 06.12.23 12:07
Оценка: 6 (1) +2
Здравствуйте, CEMb

Не очень понял из вашего описания что конкретно вам нужно, но может std::reference_wrapper вам поможет? Хотя, есть ощущение, что reloadTime_ можно было бы тупо сделать голым невладеющим указателем. Который в конструкторе Object указывал бы на какую-то глобальную переменную, а после инициализации device_ -- на что-то из device_.
Re[2]: Ссылка
От: CEMb  
Дата: 06.12.23 12:37
Оценка:
Здравствуйте, reversecode, Вы писали:

R>ничего не понял

R>можно std::optional<float> reloadTime_
R>ну или вместо ссылки указатель юзайте

Интересный вариант, спасибо!
Указатель — не совсем удобно, его на nullptr проверять надо.
Re[2]: Ссылка
От: CEMb  
Дата: 06.12.23 12:49
Оценка: +2
Здравствуйте, so5team, Вы писали:

S>Не очень понял из вашего описания что конкретно вам нужно, но может


Я тут после публикации вопроса подумал-подумал и решил, что, пожалуй, у меня косяки в архитектуре

Странно, как минимум, часто использовать внутреннюю переменную из Device в Object. Если такие проверки действительно нужны — их надо попробовать перенести в Device, а классу-хозяину передавать туда нужную для сравнения информацию. И тогда device_->GetReloadTime() (даже с проверкой) должно быть достаточно. Можно даже избежать проверки через тот же optional или reference_wrapper

Если Object так сильно связан по данным с Device — логично как-то объединить/распилить эти классы в иерархии (в некий средний класс) чтобы вся информация по процессу была под одним капотом.

Короче, это всё моё внутреннее несовершенство
Re[3]: Ссылка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 06.12.23 12:54
Оценка:
Здравствуйте, CEMb, Вы писали:

R>>можно std::optional<float> reloadTime_

R>>ну или вместо ссылки указатель юзайте

CEM>Интересный вариант, спасибо!

CEM>Указатель — не совсем удобно, его на nullptr проверять надо.

std::optional — это не про удобство. И там тоже надо проверять на has_value(). А ты как хотел?

А указатель можно не проверять, если ты гарантируешь, что он не будет нулевым, а пользовательский код не может его поменять (не, ну если задаться целью, конечно всё может быть, но это вылезет сразу)
Маньяк Робокряк колесит по городу
Re[3]: Ссылка
От: reversecode google
Дата: 06.12.23 12:55
Оценка:
кажется понимаю
вы хотите что бы ссылка была всегда валидна
какие бы способы не выбирали
все равно нужно будет трекать а валидно ли, будь то std::optional или указатель
а referrence_wrapper вообще в вашем случае опасно
поскольку он может разименоваться при обращении в нулл до создания объекта

если там не float а что то тяжелое
то придумайте что то типа std::optional<std::reference_wrapper<BIG_OBJECT>>
Re: Ссылка
От: B0FEE664  
Дата: 06.12.23 14:13
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Тема про realtime и быстродействие.

CEM>
CEM>class Device;
CEM>class Object
CEM>{

CEM>private:
CEM>    std::unique_ptr<Device> device_{};

CEM>    const float& reloadTime_; // условно, это ссылка, по которой вопрос
CEM>};
CEM>


CEM>Допустим, у объекта Object в некоторый момент инициализируется переменная device_, у девайса есть время перезагрузки, которое можно из него получить методами. И, например, у него есть метод, который возвращает const-ссылку на свою внутреннюю переменную float reloadTime_;

Тут ссылка не нужна. Если рассматривать reloadTime_ как кэш значение, то всё просто — при инициализации device_ инициализируете reloadTime_. Чтобы выразить константность для доступа можно добавить приватный метод inline float GetReloadTime() const и нигде не обращаться за значением напрямую.

Если умеете пользоваться assert (не забываете про #define NDEBUG ) то что-то вроде:
class Object
{
private:
    std::unique_ptr<Device> device_{};
    float reloadTime_;
private:
    inline float GetReloadTime() const
    {    
        assert(device_);
        return reloadTime_;
    }
};


Ну или написать класс PropertyCache, если хочется заморочиться...
И каждый день — без права на ошибку...
Re: Ссылка
От: rg45 СССР  
Дата: 06.12.23 16:16
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>
CEM>class Device;
CEM>class Object
CEM>{

CEM>private:
CEM>    std::unique_ptr<Device> device_{};

CEM>    const float& reloadTime_; // условно, это ссылка, по которой вопрос
CEM>};
CEM>


CEM>Чего хочется:

CEM>1. Удобства в коде. Поэтому любые другие идеи приветствуются тоже!
CEM>2. Оптимизации. Но даже с GetReloadTime() проблем бы не было: компилятор туда ровно ту же ссылку на переменную Device::reloadTime_ поставит. Единственный момент тут — это проверка, что device_ не nullptr. Таких объектов как reloadTime_ может быть много, и они активно используются в логике. Хотелось бы не добавлять условия, если есть возможность это не делать.

Я не совсем понимаю, каким образом эта ссылка избавляет от проверок device_ на nullptr. Ведь когда заканчивается вермя жизни объекта device, ссылка тут же становится невалидной. А если устройство класса Object гарантирует, что время жизни объекта Object не превышает время жизни объекта Device, то проверки на nullptr достаточно только одной — в конструкторе класса Object.

Приватная фунция-член вместо ссылки — не вариант?

class Device;
class Object
{

private:
    std::unique_ptr<Device> device_{};

    float reloadTime() const { 
         assert(device_);        
         return device_->GetReloadTime();
    }
};


И в коде потом используешь reloadTime() вместо reloadTime_;
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 06.12.2023 18:27 rg45 . Предыдущая версия . Еще …
Отредактировано 06.12.2023 17:05 rg45 . Предыдущая версия .
Отредактировано 06.12.2023 16:21 rg45 . Предыдущая версия .
Отредактировано 06.12.2023 16:17 rg45 . Предыдущая версия .
Re[3]: Ссылка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 07.12.23 12:47
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Указатель — не совсем удобно, его на nullptr проверять надо.


Сейчас опять набегут критики, но таки надо подчеркнуть, что необходимость проверять указатель на nullptr возникает лишь в случае, когда логика программы допускает такое значение. Если же по логике этого не допускается, то технически (на уровне двоичного кода) работа и с указателем, и со ссылкой организуется одинаково. Даже если какой-то компилятор умеет в отладочном режиме автоматически проверять ссылку перед ее использованием, он так же может уметь проверять и указатель перед разыменованием.
Re[4]: Ссылка
От: rg45 СССР  
Дата: 08.12.23 15:37
Оценка: :)))
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Сейчас опять набегут критики, но таки надо подчеркнуть, что необходимость проверять указатель на nullptr возникает лишь в случае, когда логика программы допускает такое значение.


Мы помним, помним — указатель нужно разыменовывать без проверки, а на nullptr проверять потом ссылку: https://rsdn.org/forum/cpp/8499561.1
Автор: Евгений Музыченко
Дата: 05.04.23
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[5]: Ссылка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 09.12.23 13:36
Оценка: :))
Здравствуйте, rg45, Вы писали:

R>Мы помним, помним


Или память подводит, или передергинг детектед.
Re[6]: Ссылка
От: rg45 СССР  
Дата: 09.12.23 15:23
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

R>>Мы помним, помним — указатель нужно разыменовывать без проверки, а на nullptr проверять потом ссылку: https://rsdn.org/forum/cpp/8499561.1
Автор: Евгений Музыченко
Дата: 05.04.23


ЕМ>Или память подводит, или передергинг детектед.


Какая еще память, выдумщик? Я же ссылку привел на твое утверждение. Эх, никак ты не привыкнешь, что все слова здесь записываются.

P.S. Ты думал, что если ты обрежешь конец моей цитаты, где содержится ссылка, то можно будет белое назвать черным? Глупенький.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 09.12.2023 15:25 rg45 . Предыдущая версия .
Re[7]: Ссылка
От: reversecode google
Дата: 09.12.23 15:51
Оценка:
Здравствуйте, rg45, Вы писали:
Здравствуйте, Евгений Музыченко, Вы писали:

джентельмены
не оскверняйте тему
предлагаю вам начать на шпагах
продолжить на мечах
и закончить на пистолетах
Re[8]: Ссылка
От: rg45 СССР  
Дата: 10.12.23 09:52
Оценка:
Здравствуйте, reversecode, Вы писали:

R>джентельмены

R>не оскверняйте тему
R>предлагаю вам начать на шпагах
R>продолжить на мечах
R>и закончить на пистолетах

Ты миротворец или подстрекатель? Не пойму что-то.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[7]: Ссылка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.12.23 21:03
Оценка:
Здравствуйте, rg45, Вы писали:

R>Какая еще память, выдумщик?


Ваша, которая в мозгу. Вместе с теми зонами, что отвечают за восприятие смысла.

R>Я же ссылку привел на твое утверждение. Эх, никак ты не привыкнешь, что все слова здесь записываются.


Так в том и дело, что записанные слова не соответствуют тому смыслу, с каким Вы их пересказали.

Я понимаю, что очень чешется желание быть язвительным, но надо ж пытаться держать себя в руках.
Re[8]: Ссылка
От: rg45 СССР  
Дата: 10.12.23 21:37
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Так в том и дело, что записанные слова не соответствуют тому смыслу, с каким Вы их пересказали.


Следи внимательно: вот здесь
Автор: Евгений Музыченко
Дата: 05.04.23
ты допускаешь существование ссылки, созданной из нулевого указателя. А вот здесь
Автор: Евгений Музыченко
Дата: 07.12 15:47
даешь рекоммендации по работе с указателями. И эти рекомендации (внезапно) объясняют, каким образом у тебя появляются такие ссылки.

Ну и где я что исказил? Ты, вместо того, чтоб признать ошибку, ведешь себя подобно ужу на сковородке.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 10.12.2023 22:03 rg45 . Предыдущая версия . Еще …
Отредактировано 10.12.2023 22:02 rg45 . Предыдущая версия .
Отредактировано 10.12.2023 21:57 rg45 . Предыдущая версия .
Отредактировано 10.12.2023 21:54 rg45 . Предыдущая версия .
Отредактировано 10.12.2023 21:45 rg45 . Предыдущая версия .
Отредактировано 10.12.2023 21:44 rg45 . Предыдущая версия .
Отредактировано 10.12.2023 21:42 rg45 . Предыдущая версия .
Отредактировано 10.12.2023 21:40 rg45 . Предыдущая версия .
Отредактировано 10.12.2023 21:39 rg45 . Предыдущая версия .
Re[8]: Ссылка
От: rg45 СССР  
Дата: 10.12.23 21:57
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>>Или память подводит, или передергинг детектед.

ЕМ>>Ваша, которая в мозгу. Вместе с теми зонами, что отвечают за восприятие смысла.

ЕМ>Я понимаю, что очень чешется желание быть язвительным, но надо ж пытаться держать себя в руках.


Ну, по крайней мере, это не я тебе диагнозы по интернету тут ставлю. Так кому из нас хочется быть язвительным? Мне кажется, или ты пытаешься спроецировать свое эмоциональное состояние на меня?
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 10.12.2023 22:09 rg45 . Предыдущая версия . Еще …
Отредактировано 10.12.2023 22:04 rg45 . Предыдущая версия .
Отредактировано 10.12.2023 21:59 rg45 . Предыдущая версия .
Re: Ссылка
От: cppguard  
Дата: 11.12.23 00:54
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>2. Оптимизации. Но даже с GetReloadTime() проблем бы не было: компилятор туда ровно ту же ссылку на переменную Device::reloadTime_ поставит. Единственный момент тут — это проверка, что device_ не nullptr. Таких объектов как reloadTime_ может быть много, и они активно используются в логике. Хотелось бы не добавлять условия, если есть возможность это не делать.


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