Выравнивание памяти класса C ++

Недавно я видел, как один из моих коллег сделал что-то похожее на это:

#include <iostream>

class myClass
{
public:
float X, Y;
myClass(int x, int y) : X(x), Y(y){}
};

int main()
{
char buffer[1024] = { 0 };
myClass example(12, 24);
memcpy(buffer, &example.X, sizeof(float) * 2); // Is this safe? Will X always be allocated next o Y?
}

По сути, он пытается скопировать оба X и Y в char[] все за один шаг, говоря копии памяти, чтобы прочитать вдвое больше, чем float.

Это определенно работает и обычно, я думаю, это круто и двигаться дальше. Но из-за всего неопределенного поведения в C ++. Я хотел бы знать, гарантировано ли это всегда работает. Будет ли Y всегда выделяться сразу после X?

2

Решение

Это определенно работает и обычно, я думаю, это круто и двигаться дальше. Но из-за всего неопределенного поведения в C ++. Я хотел бы знать, гарантировано ли это всегда работает. Будет ли Y всегда выделяться сразу после X?

Точно нет. Любая структура может иметь отступ между членами. У большинства компиляторов будет достаточно документации, чтобы сказать вам, безопасно ли на вашей конкретной платформе с этим компилятором, но это никогда не будет безопасно для переноса. Вы должен использование sizeof(myClass) вместо sizeof(float)*2, (И мне любопытно, почему ты не хотел бы, во-первых …)

Если вы в C ++ 03, здесь есть большая проблема: myClass имеет определяемый пользователем конструктор, так что это не POD, поэтому вы не можете переносить memcpy это вообще. (Сначала я думал, что это также проблема в C ++ 11, но, поскольку все ваши участники имеют одинаковый контроль доступа, является класс стандартного макета, что означает, что вы можете memcpy это в C ++ 11.)

Наконец, это может показаться немного глупым, но нет гарантии, что 1024 байта будет достаточно места для структуры из двух floats. Вы действительно должны сделать что-то вроде char buffer[sizeof(myClass)],

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]