强制C中的无序结构字段

时间:2012-07-13 13:30:14

标签: c optimization data-structures struct

我正在研究面向对象语言的转换器到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中添加,删除或更改字段的顺序。因此,尽管未使用字段ac,但它们会使代码膨胀。

如何实现“无序字段”行为?如果我只有一个静态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代码,因此您可以将其视为跨语言编译器。我很高兴能够向我解释我应该在何处以及如何使用结构,但在这种情况下,我需要一些神奇的帮助以简化优化:)

2 个答案:

答案 0 :(得分:4)

听起来你正试图让编译器(或链接器 - 你提到的“删除未使用的对象”优化实际上已完成)来自动检测未使用的结构字段。它不能,因为它是不可能的。这是一个全局优化 - 您需要知道Universe中任何引用给定字段的代码都没有。但是,如果代码将动态绑定到将来引用该字段的某些内容(代码不是当前链接的一部分),该怎么办?用同一个头编译库怎么样?编译器应该有多大的结构,因为它不知道如何使用它?

如果你想做这个优化,我担心你必须自己做。 C语言没有可用的工具。

答案 1 :(得分:0)

您是否考虑过Unions作为Structs的替代方案?

如果您一次只使用一个字段并且担心内存,那么这是完美的数据结构。

相关问题