Недавно я видел, как один из моих коллег делал что-то подобное:
#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?
alignof
для предоставления статического утверждения, что Y идет сразу после X без заполнения? - person Lily Ballard   schedule 08.11.2012sizeof(float)*2
вместоsizeof(myClass)
? А почему1024
для буфера? - person Nemo   schedule 08.11.2012sizeof
для класса. Даже если бы он был легальным и переносимым, он был бы многословным, утомительным, и в нем было бы очень легко ошибиться и вызвать приятные ошибки, связанные с переполнением буфера. - person abarnert   schedule 08.11.2012