C++类内存对齐

C++ Class Memory Alignment

本文关键字:对齐 内存 C++      更新时间:2023-10-16

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

#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 之后分配吗?

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

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

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

最后,这似乎有点愚蠢,但不能保证 1024 字节足以容纳两个float的结构。你真的应该做一些像char buffer[sizeof(myClass)].