0

вариант1:

struct _color
{
    uchar b, g, r, a;
    _color(uint c) { *((uint*)this) = c; }
};

предупреждает, что a,r,g,b не инициализированы вариант2:

union _color2
{
    struct
    {
        uchar b, g, r, a;
    };
    uint c;
    _color2(uint c_) { c = c_; }
};

предупреждает, что структура без имени. Хочется чтобы было просто, и без предупреждений! как можно по другому? важно! конструктор должен быть по быстроте такой же как и в 1,2 варианте.

Ivan
  • 1
  • 2
    В первом примере следует удалить *((uint*)this) = c; и инициализировать поля. – user7860670 Jun 10 '22 at 08:15
  • У приведенного кода есть проблема с порядком байт и разнообразными паддингами. В целом - попытка оптимизировать за компилятор. Но если очень хочется - memcpy в помощь. – KoVadim Jun 10 '22 at 08:47
  • во втором случае ISO C++ запрещает анонимные структуры. Надо дать имя типу структуры или имя переменной данного типа. – AlexGlebe Jun 10 '22 at 08:47
  • инициализировать поля - полагаться на случай, что компилятор правильно оптимизирует. а memcpy - вообще вызов функции. конструктор должен быть максимально быстрым! – Ivan Jun 10 '22 at 09:18
  • 1
    ага, вот оно - преждевременная пессимизация. memcpy давно уже "магическая функция" и компилятор ее эффективно заменяет на код. И главное правило - не пытайтесь обмануть компилятор (в коде это как раз и происходит) - он поймает и накажет. Пишите максимально простой код и все будет работать. Потом профайлер и искать слабые места. – KoVadim Jun 10 '22 at 09:21
  • По-моему, надо массивом, тогда будет более надежно? – Mikhajlo Jun 11 '22 at 17:31
  • Оба варианта вызывают неопределённое поведение, т.к. нарушено правило строгих псевдонимов. – wololo Jun 11 '22 at 21:03

0 Answers0