有一些C项目的结构充满了ifdefs(例如WolfSSL https://github.com/wolfSSL/wolfssl/blob/bb70fee1ecff8945af8179f48e90d78ea7007c66/wolfssl/internal.h#L2792)
struct {
int filed_1;
int field_2;
#ifdef SETTING_A
int filed_b;
#endif
#ifdef SETTING_B
int field_b;
#endif
}
原因是为了减少未使用选项的结构体大小。有很多的ifdefs!无处不在!
是否有一种c++方法来摆脱这些ifdef,保留编译器优化未使用字段的能力?也许是模板、使用或CRTP继承?
您可以在c++ 20中使用[[no_unique_address]]
和一些语法。但是,这并不能保证在较小的类型中产生结果,因此我仍然建议您使用#define
s
template<typename>
struct Empty {};
template<typename T, bool enable, typename uniquer>
using MaybeEmpty = std::conditional_t<enable, T, Empty<uniquer>>;
struct foo {
int filed_1;
int field_2;
[[no_unique_address]] MaybeEmpty<int, settingA, struct filed_b_uniquer> filed_b;
[[no_unique_address]] MaybeEmpty<int, settingB, struct field_b_uniquer> field_b;
};
在c++ 20之前,这必须通过基类
完成。struct with_filed_b {
int filed_b;
};
struct with_field_b {
int field_b;
};
struct foo : MaybeEmpty<with_filed_b, settingA, struct filed_b_uniquer>, MaybeEmpty<with_field_b , settingB, struct field_b_uniquer> {
int filed_1;
int field_2;
};