最近,我遇到了几个使用"手动"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) 考虑到我的平台是小端,我假定为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)或语言是否抽象出字节序?这是怎么回事?