У меня есть функция, которая получает структуру конфигурации, которая на данный момент представляет собой просто структуру, содержащую массив
class ShmConfig {
public:
std::int64_t shellShmSize[ShellId_Count];
};
И я передаю его другой функции в функции с std::move
, потому что я хочу, чтобы все места кода, которые его копируют, не зависели от того факта, что его можно эффективно скопировать.
m_allocator.setup(std::move(config));
Если позже его можно будет более эффективно переместить (возможно, потому, что я добавлю к нему std::string
), он автоматически станет более эффективным. Но clang-tidy
не советует
std::move
переменной 'config
' тривиально копируемого типа 'ShmConfig
' не имеет никакого эффекта; удалитьstd::move()
Не понимаю, почему это желательно. Есть ли недостаток в оборачивании move
? Следует ли следовать этим советам только в том случае, если кто-то регулярно запускает clang-tidy, чтобы можно было обнаружить случаи, когда std::move
будет иметь смысл позже, после добавления элементов данных?
config
послеstd::move(config)
- person 463035818_is_not_a_number   schedule 18.05.2021ShmConfig
не имеет управляемых ресурсов,move
семантика не будет иметь значения. Добавлениеstd::move
на всякий случай, что в какой-то будущей версииShmConfig
будет перемещаться ресурс переменных-членов, похоже на преждевременную оптимизацию. ЯГНИ. - person Eljay   schedule 18.05.2021std::move
имеет очень заметный эффект. Это говорит мне в будущем, что меня больше не волнует значение переменной, и я не должен использовать его, кроме как для повторного присвоения. Это та явная аннотация, которая даже допускает оптимизацию, связанную с перемещением. Жалко, что он называлсяmove
, а неmay_move_now
. Думаю, последнее было не таким уж броским. - person StoryTeller - Unslander Monica   schedule 18.05.2021clang-tidy
иногда может давать не самый лучший совет stackoverflow.com/q/52871026/817643 а> - person StoryTeller - Unslander Monica   schedule 18.05.2021unique_ptr
) идут с определенными состояниями перемещения. Нередко проверять состояние перемещения из объекта как сигнал о том, что объект уже был использован. Кто-то, привыкший к этому шаблону, может сделать/* set up if not already set up */ if (is_ready(config)) m_allocator.setup(std::move(config))
, чтобы определить, использовалась ли конфигурация предыдущим вызовомsetup
. (Чаще встречается, еслиShmConfig
имеетoperator bool()
преобразование.) В предупреждении говорится: «Эй, этот объект может вести себя не так, как вы ожидаете». - person Raymond Chen   schedule 18.05.2021Adding std::move just in case some future version
: Но это не только преждевременная оптимизация, это семантика. Как разработчик, вы хотите выразить что-то концептуально, полностью правильно на более абстрактном уровне. Я полностью согласен с StoryTeller здесь, что источник путаницы кроется в вводящей в заблуждение терминологии, выбранной дляstd::move
. По крайней мере, для классов / структур, которые, вероятно, могут быть изменены / расширены в будущем, я думаю, следует предпочесть правильную семантику ограничению кода эффективному поведению компилятора. - person Secundi   schedule 27.05.2021std::move
, потому чтоstd::permission_to_transplant_innards_leaving_the_original_object_in_a_valid_but_unspecified_state
может быть слишком многословным. - person Eljay   schedule 27.05.2021std::move
вообще ничего не перемещает, кроме упомянутых здесь проблем, вполне разумно пересмотреть терминологию. - person Secundi   schedule 28.05.2021std::forward
продвигает вперед или просто выполняет приведение? - person Johannes Schaub - litb   schedule 28.05.2021std::move
иstd::forward
здесь по-прежнему являются неплохим компромиссом с несколькими исключительными случаями, когда вам нужно переосмыслить их фактическое поведение, clang-tidy слишком остро реагирует здесь, поскольку это относится исключительно к эффективному поведению без необходимого внимания к семантике. Это как-то не совсем следствие, поскольку он (?) Жалуется не на фактическое приведение, а на сам вызов метода, который на самом деле является исключительно семантической оболочкой. - person Secundi   schedule 28.05.2021std::move
, где влияние на производительность может быть значимым, теоретически и практически. - person Secundi   schedule 28.05.2021