内存中C++对象的结构与结构

hha*_*fez 46 c++ struct

如果我有一个课程如下

   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 = 8foo_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:

  • 所有数据成员都是公共的,它们本身就是POD或基本类型(但不是引用或指向成员类型的指针),或者是这样的数组
  • 它没有用户定义的构造函数,赋值运算符或析构函数
  • 它没有虚拟功能
  • 它没有基类

关于唯一允许的"C++ - isms"是非虚拟成员函数,静态成员和成员函数.

由于您的类同时具有构造函数和析构函数,因此它正式说不是POD类型,因此保证不成立.(尽管正如其他人所提到的,实际上,只要没有虚函数,在您尝试的任何编译器上,两个布局可能都是相同的).

有关更多详细信息,请参阅C++ FAQ Lite的 [26.7]部分.

  • 由于他使用的是一个单独的库,我认为编译库结构对齐设置的差异可能在编译时可能导致内存布局差异.似乎不太可能,但可能. (3认同)

Chr*_*isW 10

example_struct的内存结构是否与Example_Class中的结构相似

行为无法保证,并且与编译器有关.

话虽如此,答案是"是的,在我的机器上",只要Example_Class不包含虚方法(并且不从基类继承).


Gre*_*ill 7

在您描述的情况下,答案是"可能是的".但是,如果类具有任何虚函数(包括可以从基类继承的虚析构函数),或者使用多重继承,则类布局可能不同.