C++类内存对齐

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)

基本上,他正试图复制两个XYchar[]只需一个步骤,告诉内存拷贝读取浮动的两倍.

它绝对有效,通常情况下,我认为这很酷,继续前进.但是由于C++中所有未定义的行为.我想知道这是否能保证始终有效.Y会在X之后立即分配吗?

aba*_*ert 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)].

  • 它可能不是POD,但它是标准布局类. (3认同)
  • @GManNickG:不.这也是我记得的,但n3242 9.0.7说我们错了.规则是"对所有非静态数据成员具有相同的访问控制(第11条)".所以,如果_all_数据成员是私有的,那很好; 它只有一个类有_both_私有和公共(或私人和受保护等)数据成员.(请注意,这仅适用于数据成员 - 具有私有数据成员的公共函数成员不会破坏标准布局.) (2认同)