有没有办法强制编译器(特别是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 ++类.但是,我想如果我把它用于工作,我也会将它用于网络序列化(当然在相同的端机上).
您的编译器实际上正是为您做的.甚至可以通过将this指针放在寄存器中而不是将其推入堆栈(这至少是MSVC在Windows上执行的操作)来乐观地进行优化,这是标准C调用约定所无法做到的.
至于:
obSize = sizeof(float)*3 + sizeof(void*)*number_of_class_methods
Run Code Online (Sandbox Code Playgroud)
void*表示指向数据的指针,而不是指向代码的指针(它们不需要具有相同的大小)3 * sizeof(float).