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, вызванных неприсоединенным доступом.
Конструктор копирования вообще не связан с проблемой.