GCC可以编译类作为结构吗?

Imb*_*dir -1 c++ struct class

有没有办法强制编译器(特别是GCC)使类编译到面向对象的C?具体来说,我想要实现的是写这个:

class Foo {
public:
  float x, y, z;
  float bar();
  int other();
  ...etc
};

Foo f;
float result = f.bar()
int obSize = sizeof(Foo);
Run Code Online (Sandbox Code Playgroud)

然而编译完全相同:

Struct Foo { float x, y, z; };
float Foo_bar(Foo *this);

Foo f;
float result = Foo_bar(&f);
int obSize = sizeof(Foo);
Run Code Online (Sandbox Code Playgroud)

我的动机是提高可读性,但不会对Foo的每个对象造成内存损失.我想通常obSize的类实现

obSize = sizeof(float)*3 + sizeof(void*)*number_of_class_methods
Run Code Online (Sandbox Code Playgroud)

主要是在内存受限微控制器中使用c ++类.但是,我想如果我把它用于工作,我也会将它用于网络序列化(当然在相同的端机上).

Ale*_* C. 7

您的编译器实际上正是为您做的.甚至可以通过将this指针放在寄存器中而不是将其推入堆栈(这至少是MSVC在Windows上执行的操作)来乐观地进行优化,这是标准C调用约定所无法做到的.

至于:

obSize = sizeof(float)*3 + sizeof(void*)*number_of_class_methods
Run Code Online (Sandbox Code Playgroud)
  1. 这是完全错误的.你有没试过吗?
  2. 即使您有虚函数,也只会向每个对象添加一个指向函数表的指针(每个类一个表).如果没有虚函数,则除了其成员之外的任何对象都不会添加任何内容(并且不会生成任何函数表).
  3. void*表示指向数据的指针,而不是指向代码的指针(它们不需要具有相同的大小)
  4. 无法保证等效C结构的大小3 * sizeof(float).