在struct/class中包装数据的快速方法

Nic*_*ick 5 c++

编辑: 主要目的是允许操作底层数据作为封装结构的一部分,而不是直接数据操作.

在结构中包含一些数据时,建议使用以下哪种方法:

  1. 保持指向结构中数据的指针:

    new s(buf),将buf存储在本地字段中(s->buf = buf)

  2. 将内存地址重新解释为一个结构:

    reinterpret_cast<s*>(buf)

  3. new运算符用于数据所在的内存地址:

    new(buf) s;

以下是这些方法的示例程序:

#include <iostream>
using namespace std;

struct s {
    int* i;
    s(int* buf) : i(buf) {}
    int getValue() { return *i * 2; }
};

struct s2 {
    int i;
    int getValue() { return i * 2; }
};

int main() {
    int buf = 10;
    s a(&buf);
    cout << "value: " << a.getValue() << ", size: " << sizeof(a) << ", address: " << &a << ", buf-address: " << &buf << endl;

    s2* a2 = new(&buf) s2;
    cout << "value: " << a2->getValue() << ", size: " << sizeof(*a2) << ", address: " << a2 << ", buf-address: " << &buf << endl;

    s2* a3 = reinterpret_cast<s2*>(&buf);
    cout << "value: " << a3->getValue() << ", size: " << sizeof(*a3) << ", address: " << a3 << ", buf-address: " << &buf << endl;
}
Run Code Online (Sandbox Code Playgroud)

并输出:

value: 20, size: 4, address: 0027F958, buf-address: 0027F964
value: 20, size: 4, address: 0027F964, buf-address: 0027F964
value: 20, size: 4, address: 0027F964, buf-address: 0027F964
Run Code Online (Sandbox Code Playgroud)

尺寸和时间都很重要.此外,可维护性很重要,例如,有人可能会错误地添加虚拟功能s2(这会弄乱数据对齐).

谢谢!

Mar*_*k B 3

放置 new仍会调用构造函数,如果这样的构造函数存在(或将来在不知不觉中创建),则会清除缓冲区中已经存在的任何内容,因此我认为这不是一个安全的选择。reinterpret_cast是未定义的行为,即使它可能看起来对您有用。存储本地指针似乎是最好的选择,尽管您只给出了您想要做什么的非常微小的暗示。

如果您在此处尝试序列化,请记住重要问题,例如sizeof(int)字节顺序。