c++ - 直接访问唯一的类数据成员

标签 c++ c++11 templates memory-address

我有一个具有唯一公共(public)数据成员的类,它是一个内置类型:

class foo {
public:
    int data;

    foo(int dataIn) : data(dataIn) {}
    virtual ~foo() {}

    // Some other class methods
protected:
    // Some internal helper class methods
};

在另一个类中,我想使用memcpy 方法:

template<typename T>class bar {
protected:
    T data;
public:
    bar() {}
    virtual ~bar() {}

    void read(unsigned char* readBuff, const std::size_t &readSize) {
        // Some stuff
        std::memcpy(readBuff, &(this->data), readSize);
        // Some stuff
    }
};

T 是内置类型或 foo 的实例时,可以使用 bar

但是 T 是 foo 并且因此 bar 中的 datafoo 实例吗,我是否确保阅读来自 &(this->data) 指向的元素将是 foo 中的 data?

当我运行这个时:

foo x(12);
std::cout << sizeof(foo);

我得到 4,所以 foo 似乎正好是一个 int 的大小,所以我自然会认为即使不指定 也可以直接读取/写入 x >x.data 将写入数据。是真的吗?

我需要与 C++11 兼容。

最佳答案

没有。

对于有虚函数的类,编译器通常会在类的开头插入一些元数据。您不能假定实例的地址也是其第一个成员的地址。

您可以使用 if constexpr 来区分这两种情况:

    if constexpr ( std::is_same_v<std::decay_t<T>, foo> ) {
        std::memcpy(readBuff, &(this->data.data), readSize);
    } else {
        std::memcpy(readBuff, &(this->data), readSize);
    }

关于c++ - 直接访问唯一的类数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49444591/

相关文章:

c++ - 通过构造函数和析构函数实现 RAII 是否被认为是错误的 'Modern C++'?

c++ - 如何使用 boost::date_time 从 time_t 获取本地日期时间?

c++ - 使用一维迭代访问二维数组

c++ - 我在这里支付违约 build 费用吗?如果支付的话,我可以避免吗?

javascript - 数据包含在一个数组/json中,想通过DOM注入(inject)到页面中,jQ有模板吗?

c++ - MFC中不断增加进度条

c++ - 未解析的外部符号 glewExperimental

C++ 创建一个 char* 迭代器

c++ - 可变参数模板中的模板参数推导失败

c++ - 模板函数类型推导和返回类型