C++类内存对齐
C++ Class 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?
}
基本上,他试图通过告诉内存副本读取两倍的浮点数大小,一步到位地将X
和Y
复制到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)]
.
相关文章:
- 使 std::vector 分配对齐内存的现代方法
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- Linux C++ 中的页面对齐内存分配
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 如何使用此宏测试是否对齐内存
- g++ 如何对齐内存以确保对齐从缓存行的开头开始?
- 正确对齐内存模板,参数顺序不变
- 在 C/C++ 中在特定地址边界上对齐内存是否仍能提高 x86 性能?
- 读取 /编写部分分配的对齐内存
- 指向对齐内存的指针
- 在C++11中,推荐的对齐内存的方法是什么
- C++-对齐内存
- m = XMMatrixIdentity() - 类中的对齐内存后崩溃
- 新字符是否实际上保证类类型的对齐内存
- 分配32字节对齐内存的分配器
- 如何从操作符new或mremap的malloc中获取页对齐内存
- 新 char[] 产生对齐内存的标准要求C++背后的意图是什么?
- 未对齐内存访问:它是定义的行为或不
- 在c++中声明、操作和访问未对齐内存
- c++ 11中的动态对齐内存分配