Reinterpret_cast в неглавленной памяти

Предполагая следующий код:

struct A
{
    int a;
    int b;
};

char* buffer = receivedFromSomeWhere();

A a = *reinterpret_cast<A*>(buffer + 1);

Если buffer + 0 выровнено по размеру int, buffer + 1 будет, скорее всего, в неизмененной памяти. Конструктор копии по умолчанию, вероятно, с радостью скопирует два неглавных элемента int a и b. На архитектуре x86/x64, за исключением замедления кода, повлияет ли она на конструкцию копирования a любым неприятным способом?

Я знаю, что хорошая сериализация разрешит проблему с неравнозначной памятью (возможно, добавив где-нибудь где-нибудь, чтобы структура a была выровнена в buffer), но в моем случае я не несу ответственности за это часть.

Ответ 1

Комбинация С++ и использование архитектуры x86_64 недостаточна, чтобы гарантировать, что поддерживаются неравномерные обращения. У вас должна быть дополнительная гарантия от вашей конкретной реализации С++, которая поддерживает этот способ reinterpret_cast, даже если адрес не выравнивается. Если вы укажете свой конкретный компилятор и целевую систему, кто-то может сказать вам, поддерживает ли он эти операции.

В отсутствие такой гарантии вы можете использовать memcpy для копирования байтов из неравномерного буфера в объект POD (простые старые данные). Хороший компилятор может оптимизировать такие обращения.

Ответ 2

Архитектура x86/x64 допускает несвязанный доступ. Как вы уже писали, это может повлиять на производительность. Но поскольку процессор позволяет все операции, никаких других неприятных проблем не будет.

Вы должны иметь в виду, что кеш в современных процессорах сокращает циклы памяти. Таким образом, у вас не будет столько циклов SDRAM, вызванных неприсоединенным доступом.

Конструктор копирования вообще не связан с проблемой.