我正在研究面向对象语言的转换器到C中以优化puproses,我遇到了设计问题。
考虑使用伪语言为转换器提供以下类:
class C {
int a;
double b;
int c;
constructor C(int value) {
this.a = value;
this.b = this.a / 10.0;
this.c = 0;
}
void say() {
print(this.b);
}
}
当直截了当时,我们可以在C中将此类表示为类似结构(跳过错误检查):
typedef struct {
int a;
double b;
int c;
} _class_C;
_class_C* _ctor_C(int value) {
this = malloc(sizeof(_class_C));
this->a = value;
this->b = this->a / 10.0;
this->c = 0;
return this;
}
void _method_C_say(_class_C *this) {
printf("%.2f", this->b);
}
void _dtor_C(_class_C *this) {
free(this);
}
此解决方案受到C编译器绑定的承诺的影响 - 请勿在struct中添加,删除或更改字段的顺序。因此,尽管未使用字段a
和c
,但它们会使代码膨胀。
如何实现“无序字段”行为?如果我只有一个静态C
,则可以按如下方式编写:
int _staticfield_C_a;
double _staticfield_C_b;
int _staticfield_C_c;
void _ctor_C(int value) {
_staticfield_C_a = value;
_staticfield_C_b = _staticfield_C_a / 10.0;
_staticfield_C_c = 0;
}
void _staticmethod_C_say() {
printf("%.2f", _staticfield_C_b);
}
所以编译器可以优化多余的{或1}}冗余或未使用的字段,但是当_staticfield_C_b
可以动态实例化时我应该使用什么解决方案,我不介意字段的顺序,内存布局和代码人性化可读性?
更新:应该注意的是,我并没有尝试强制执行编译器来使用 structs 进行魔术,我想要一些替换它们就像无序字段的结构一样 - 就像我在静态示例中提供的那样,无论可读性水平如何。
更新:评论中有一个流行的观点,我的问题与转换器本身的设计有关,就像我选择错误的范例或语言一样。转换器本身是用Python编写的,它采用通用的面向对象程序的源代码,处理它并输出要编译的等效C代码,因此您可以将其视为跨语言编译器。我很高兴能够向我解释我应该在何处以及如何使用结构,但在这种情况下,我需要一些神奇的帮助以简化优化:)
答案 0 :(得分:4)
听起来你正试图让编译器(或链接器 - 你提到的“删除未使用的对象”优化实际上已完成)来自动检测未使用的结构字段。它不能,因为它是不可能的。这是一个全局优化 - 您需要知道Universe中任何引用给定字段的代码都没有。但是,如果代码将动态绑定到将来引用该字段的某些内容(代码不是当前链接的一部分),该怎么办?用同一个头编译库怎么样?编译器应该有多大的结构,因为它不知道如何使用它?
如果你想做这个优化,我担心你必须自己做。 C语言没有可用的工具。
答案 1 :(得分:0)
您是否考虑过Unions
作为Structs
的替代方案?
如果您一次只使用一个字段并且担心内存,那么这是完美的数据结构。