如果我有一个课程如下
class Example_Class
{
private:
int x;
int y;
public:
Example_Class()
{
x = 8;
y = 9;
}
~Example_Class()
{ }
};
Run Code Online (Sandbox Code Playgroud)
结构如下
struct
{
int x;
int y;
} example_struct;
Run Code Online (Sandbox Code Playgroud)
记忆中的结构是否 example_struct
与其相似Example_Class
例如,如果我执行以下操作
struct example_struct foo_struct;
Example_Class foo_class = Example_Class();
memcpy(&foo_struct, &foo_class, sizeof(foo_struct));
Run Code Online (Sandbox Code Playgroud)
将foo_struct.x = 8
和foo_struct.y = 9
(即:与foo_class中的x,y值相同的值)?
我问的原因是我有一个C++库(不想改变它),它与C代码共享一个对象,我想用一个结构来表示来自C++库的对象.我只对对象的属性感兴趣.
我知道理想的情况是将Example_class包装在C和C++代码之间的公共结构中,但是更改正在使用的C++库并不容易.
j_r*_*ker 63
C++标准保证 C struct
和C++ class
(或struct
相同的东西)的内存布局是相同的,前提是C++ class
/ struct
符合POD标准("普通旧数据").那么POD是什么意思呢?
在以下情况下,类或结构是POD:
关于唯一允许的"C++ - isms"是非虚拟成员函数,静态成员和成员函数.
由于您的类同时具有构造函数和析构函数,因此它正式说不是POD类型,因此保证不成立.(尽管正如其他人所提到的,实际上,只要没有虚函数,在您尝试的任何编译器上,两个布局可能都是相同的).
有关更多详细信息,请参阅C++ FAQ Lite的 [26.7]部分.
Chr*_*isW 10
example_struct的内存结构是否与Example_Class中的结构相似
行为无法保证,并且与编译器有关.
话虽如此,答案是"是的,在我的机器上",只要Example_Class不包含虚方法(并且不从基类继承).