If I have a class as follows
class Example_Class { private: int x; int y; public: Example_Class() { x = 8; y = 9; } ~Example_Class() { } };
And a struct as follows
struct { int x; int y; } example_struct;
Is the structure in memory of the example_struct simmilar to that in Example_Class
for example if I do the following
struct example_struct foo_struct; Example_Class foo_class = Example_Class(); memcpy(&foo_struct, &foo_class, sizeof(foo_struct));
will foo_struct.x = 8 and foo_struct.y = 9 (ie: the same values as the x,y values in the foo_class) ?
The reason I ask is I have a C++ library (don’t want to change it) that is sharing an object with C code and I want to use a struct to represent the object coming from the C++ library. I’m only interested in the attributes of the object.
I know the ideal situation would be to have Example_class wrap arround a common structure between the C and C++ code but it is not going to be easy to change the C++ library in use.
The C++ standard guarantees that memory layouts of a C
structand a C++class(orstruct— same thing) will be identical, provided that the C++class/structfits the criteria of being POD (‘Plain Old Data’). So what does POD mean?A class or struct is POD if:
About the only ‘C++-isms’ allowed are non-virtual member functions, static members and member functions.
Since your class has both a constructor and a destructor, it is formally speaking not of POD type, so the guarantee does not hold. (Although, as others have mentioned, in practice the two layouts are likely to be identical on any compiler that you try, so long as there are no virtual functions).
See section [26.7] of the C++ FAQ Lite for more details.