Можно ли переносить reinterpret_cast беззнаковый массив char для структурирования указателя, содержащего только члены без знака в C ++ - PullRequest
2 голосов
/ 19 октября 2019

Мне известно, что использование reinterpret_cast для приведения массива беззнакового символа к указателю структуры может вызвать проблемы из-за заполнения и упорядочения байтов в разных системах (как в этом примере)

struct SomeData
{
    unsigned char first;
    int second;
};

unsigned char data[5];
// SomeData might be more than 5 bytes because of padding
// We can't be sure second is valid, because of bytes ordering
SomeData* someData = reinterpret_cast<SomeData*>(data); 

Но мойвопрос для структуры, имеющей только беззнаковые члены char

struct RGB
{
    unsigned char r;
    unsigned char g;
    unsigned char b;
};

unsigned char data[3];
RGB* rgbData = reinterpret_cast<RGB*>(data); 

В этом случае структура RGB является своего рода эквивалентом unsigned char [3], поэтому я бы предположил, что дополнения не будет. Я проверил с g ++ и msvc, и отступы не добавляются, это гарантировано?

1 Ответ

0 голосов
/ 19 октября 2019

В то время как reinterpret_cast является четко определенным (в том смысле, что вы можете reinterpret_cast безопасно вернуться к исходному типу), доступ к членам структуры является неопределенным поведением подразумеваемым образом: нет объекта типаRGB, поэтому в нем не может быть члена, к которому относится .

C явно и нормативно описывает обстоятельства, для которых стандарт не описывает поведение как неопределенное поведение;C ++ просто подразумевает значение в примечании, но это, в конце концов, этимология «undefined».

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