属性是类的公共(public)数据成员,可以被客户端代码访问。每当客户端代码读取或修改属性时,拥有对象都会收到通知(以获取/设置通知回调的形式)。
某些语言(如 C#)具有内置属性。
我想为 C++ 创建一个 RAM 高效的属性。
创建属性最明显的方法是这样的:
class Super;
struct Prop {
Prop( Super * super ) : m_super(*super), m_a(0) {}
int operator=( int a );
operator int() const;
int m_a;
Super & m_super;
};
struct Super {
Super() : one(this), two(this) {}
void onSet() { printf("set"); }
void onGet() { printf("get"); }
Prop one;
Prop two;
};
int Prop::operator=( int a ) { m_super.onSet(); m_a = a; return a; }
Prop::operator int() const { m_super.onGet(); return m_a; }
问题是 - 每个属性都必须保留指向外部类的指针,我认为这是昂贵的。
我想知道是否有更节省 RAM 的方法来做到这一点?
例如,如果生成了所有 Super
类,标准是否允许从属性的 this
指针获取指向外部类的指针?
像这样:
struct Prop {
Prop( uint8_t offset ) : m_offset(offset), m_a(0) {}
int operator=( int a );
operator int() const;
int m_a;
const uint8_t m_offset;
};
int Prop::operator=( int a ) {
Super * super = (Super *)( ((char *)this) + m_offset);
super->onSet(); m_a = a; return a;
}
struct Super {
// assuming exact order of properties
Super() : one(0), two(sizeof(Prop)) {}
void onSet() { printf("set"); }
void onGet() { printf("get"); }
Prop one;
Prop two;
};
因为这个偏移量是一个常量表达式,它(理论上)可以保存在 ROM 中(或者至少它可以小于 sizeof(pointer))。
或者也许还有其他方法?
最佳答案
c++ 具有作为语言扩展的属性
别再看了,msvc
has support .
clang
编译器也支持这种语法。我不确定 gcc
。
存储偏移量也可以做到
只是,在构造函数中计算相对于 this
的偏移量,ala。 :
Prop( Super& super ) {
uint8_t offset = this - std::addressof(super );//somewhat unmaintable - but may save some bytes
}
然后在使用的时候,用this
计算回来
请注意,由于对齐和填充,节省的空间可能比看起来少。
关于c++ - RAM 高效的 C++ 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58801875/