Информация об изменениях

Сообщение bit_cast от 18.06.2016 13:13

Изменено 18.06.2016 13:27 S. Schlongberg

Здравствуйте, T4r4sB, Вы писали:

TB>memmove позволяет битово копировать данные разных типов без УБЭ. Но от огребания от индейца не спасёт, как уже сказали.


Похоже, memcpy самый годный способ. Clang, GCC и MSVC его оптимизируют на mov. Хотя, окончательное решение, что использовать, буду принимать на основе бенчмарков.
Здравствуйте, T4r4sB, Вы писали:

TB>memmove позволяет битово копировать данные разных типов без УБЭ. Но от огребания от индейца не спасёт, как уже сказали.


Похоже, memcpy самый годный способ. Clang, GCC и MSVC его оптимизируют на mov. Хотя, окончательное решение, что использовать, буду принимать на основе бенчмарков.

В проекте Chromium даже есть функция bit_cast, которая именно так и сделана.

https://chromium.googlesource.com/chromium/src/+/1587f7d/base/macros.h#76

template <class Dest, class Source>
inline Dest bit_cast(const Source& source) {
  COMPILE_ASSERT(sizeof(Dest) == sizeof(Source), VerifySizesAreEqual);
  Dest dest;
  memcpy(&dest, &source, sizeof(dest));
  return dest;
}