小编gmb*_*ard的帖子

"手卷"vtable方法的优势是什么?

最近,我遇到了几个使用"手动"vtable的类型擦除实现 - Adobe ASLany_regular_t就是一个例子,虽然我已经看到它也用在Boost ASIO中(用于完成例程队列).

基本上,父类型传递一个指向静态类型的指针,该类型充满了在子类型中定义的函数指针,类似于下面的...

struct parent_t;

struct vtbl {
  void (*invoke)(parent_t *, std::ostream &);
};

struct parent_t {
  vtbl *vt;
  parent_t(vtbl *v) : vt(v) { }
  void invoke(std::ostream &os) {
    vt->invoke(this, os);
  }
};

template<typename T>
struct child_t : parent_t {
  child_t(T val) : parent_t(&vt_), value_(val) { }
  void invoke(std::ostream &os) {
    // Actual implementation here
    ...
  }
private:
  static void invoke_impl(parent_t *p, std::ostream &os) {
    static_cast<child_t *>(p)->invoke(os);
  }
  T value_;
  static vtbl vt_;
};

template<typename …
Run Code Online (Sandbox Code Playgroud)

c++ vtable type-erasure

9
推荐指数
1
解决办法
484
查看次数

将int转换为字节数组时的C++字节顺序

考虑到我的平台是小端,我假定为1的四字节整数值将表示为0x00,0x00,0x00,0x01时为字节数组表示.有了这个,有人可以向我解释为什么下面的断言失败了......

int val{1};
auto bytes = reinterpret_cast<char*>(&val);
assert(bytes[sizeof(int) - 1] == 0x01);
Run Code Online (Sandbox Code Playgroud)

......但以下断言成功......

assert(bytes[0] == 0x01);
Run Code Online (Sandbox Code Playgroud)

在转换为之后char*,字节似乎被反转.我对字节序的假设是错误的吗?编译器(clang)或语言是否抽象出字节序?这是怎么回事?

c++ casting endianness

1
推荐指数
2
解决办法
2106
查看次数

标签 统计

c++ ×2

casting ×1

endianness ×1

type-erasure ×1

vtable ×1