2

我最近看到我的一位同事做了类似的事情:

#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?
}

基本上,他试图通过告诉内存副本读取两倍大小的浮点数来一步将 theX和 the复制Y到全部中。char[]

它肯定可以正常工作,我认为这很酷并继续前进。但是由于 C++ 中所有未定义的行为。我想知道这是否保证始终有效。Y 总是在 X 之后被分配吗?

4

1 回答 1

5

它肯定可以正常工作,我认为这很酷并继续前进。但是由于 C++ 中所有未定义的行为。我想知道这是否保证始终有效。Y 总是在 X 之后被分配吗?

当然不。任何结构都可以在成员之间进行填充。大多数编译器都会有足够的文档来告诉您使用该编译器在您的特定平台上是否安全,但它绝不是安全的可移植性。您必须使用sizeof(myClass)而不是sizeof(float)*2. (而且我有点好奇为什么你一开始就不想……)

如果你在 C++03 中,这里有一个更大的问题:myClass有一个用户定义的构造函数,所以它不是 POD,所以你根本不能移植memcpy它。(我最初认为这在 C++11 中也是一个问题,但由于您的所有成员都具有相同的访问控制,因此它一个标准布局类,这意味着您可以memcpy在 C++11 中使用它。)

最后,这样说可能看起来有点傻,但不能保证 1024 字节足以容纳两个floats 的结构。你真的应该做类似的事情char buffer[sizeof(myClass)]

于 2012-11-07T20:29:41.193 回答