c++ - RAM 高效的 C++ 属性

标签 c++ properties

属性是类的公共(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/

相关文章:

JavaFX SimpleObjectProperty<T> 与 SimpleTProperty

c++ - 使用可变参数访问无参数模板函数的不明确重载

c++ - connect() 返回 "invalid argument"和 ipv6 地址

c# - 检查属性是否已设置 - 使用 Moq

ios - iOS swift 中变量值变空

c# - 我应该为数据使用公共(public)属性和私有(private)字段还是公共(public)字段?

c++ - 如何将迭代器增加 2?

c++ - 无法创建addressbook.pb.h对象(从protoc构建)

c++ - glm::dot 返回一个 vector

android - 写入文件.properties