Внутри snappy имеется раздел с условной компиляцией, который выбирает указатель dereferencing a reinterpret_cast'ed как лучшую реализацию для чтения и записи потенциально невыровненных 16, 32 и 64-битных целых чисел на архитектурах, которые, как известно, поддерживают такие операции (например, x86) , Резерв для других архитектур заключается в использовании memcpy based implementation.Допустимо использует случаи для reinterpret_cast для unaligned доступа к памяти vs memcpy?
Мое понимание заключается в том, что реализация reinterpret_cast демонстрирует неопределенное поведение, а дефинирующий детектив clang undefined действительно отмечает это.
Что меня озадачивает, хотя это: почему бы просто не использовать реализацию на основе memcpy? Я бы ожидал, что все, кроме большинства сломанных компиляторов, будут использовать intrinsics для реализации этих вызовов memcpy, поскольку размер известен во время компиляции. На самом деле я ожидал бы идентичный код из обеих реализаций на любой современной инструментальной цепочке.
Однако я также признаю, что мгновенный был написан людьми, которые знают, о чем они. Поэтому мне остается задаться вопросом, есть ли еще какое-то преимущество в использовании механизма reinterpret_cast, который перевешивает его неопределенное поведение. Не хотите, чтобы производительность зависела от качества реализации компилятора? Что-то еще я не рассматривал?
Звучит как минное поле. Существует не собственный язык, правильный способ даже * получить * объект на неуравновешенном адресе в первую очередь, поэтому единственный пример использования для этого, который я вижу, - это ввод-вывод, поэтому этот код выглядит как обертывание такие вещи, как «deserialize int». –
@KerrekSB Да, это определенно IO или протокол взлома протокола/формата. Тем не менее, см. 3.9.2 [основные типы], где он явно заявляет, что вы можете округлить допустимые экземпляры тривиально-скопируемых типов (которые, безусловно, являются явными типами ширины), через массивы символов без ссылки на выравнивание байтов массива символов. Таким образом, реализация memcpy определенно определяется поведением. И reinterpret_cast определенно не определен. – acm
Замечания, прилагаемые к [этой фиксации] (https://code.google.com/p/snappy/source/detail?r=59&path=/trunk/snappy-stubs-internal.h), являются интересными. По-видимому, это действительно влияет на производительность. –