C ++类内存对齐

时间:2012-11-07 20:25:01

标签: 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?
}

基本上,他试图将XY同时复制到char[],只需告诉内存副本读取浮动大小的两倍。

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

1 个答案:

答案 0 :(得分:5)

  

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

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

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

最后,这似乎有些愚蠢,但不能保证1024字节足以容纳两个memcpy的结构。你真的应该做float

之类的事情