Cae*_*sar 2 c++ memory-alignment
我最近看到我的一位同事做了类似的事情:
#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?
}
Run Code Online (Sandbox Code Playgroud)
基本上,他正试图复制两个X和Y到char[]只需一个步骤,告诉内存拷贝读取浮动的两倍.
它绝对有效,通常情况下,我认为这很酷,继续前进.但是由于C++中所有未定义的行为.我想知道这是否能保证始终有效.Y会在X之后立即分配吗?
它绝对有效,通常情况下,我认为这很酷,继续前进.但是由于C++中所有未定义的行为.我想知道这是否能保证始终有效.Y会在X之后立即分配吗?
当然不.任何结构都可以在成员之间填充.大多数编译器都会有足够的文档来告诉您使用该编译器在您的特定平台上是否安全,但它从不安全.你必须使用sizeof(myClass)而不是sizeof(float)*2.(而且我有点好奇为什么你不想在第一时......)
如果你在C++ 03中,这里有一个更大的问题:myClass有一个用户定义的构造函数,所以它不是POD,所以你根本不能移植memcpy它.(我最初认为这也是C++ 11中的问题,但由于所有成员都具有相同的访问控制,因此它是标准布局类,这意味着您可以memcpy在C++ 11中使用它.)
最后,这可能看起来有些愚蠢,但不能保证1024字节足以容纳两个floats 的结构.你真的应该做点什么char buffer[sizeof(myClass)].