是否有任何编译器的标准布局类型的布局要求也不适用于普通可复制类型?特别是,关键规则是指向该类型的指针是指向其第一个成员的指针(其中基类将被视为在派生类之前出现)。也就是说,该类型的地址与其基本类型是相同的地址。Trivially始终可伪造的伪标准布局?
在代码中,是否有任何常见的编译器,其中以下实际上不会工作。对我来说这似乎很常见,所以我很惊讶它在C++ 11中没有标准化。我知道肯定这在GCC中有效,我相信它在MSVC中工作(尽管我可能是错的)。在哪个非历史编译器中,上述内容不能按预期工作?
扩展示例
上面的例子显示了基本的问题,但可能不会显示,会得到一个有意图。这是一个稍微冗长的例子。基本上任何人都可以调用“发送”来排队消息,然后稍后会通过回退到其实际类型来发送每条消息。
struct header { int len, id; }
struct derived : public header { int other, fields; }
void send(header * msg)
{
char * buffer = get_suitably_aligned_buffer(msg->len);
memcpy(buffer, msg, msg->len);
}
void dispatch(char * buffer)
{
header * msg = static_cast<header*>(buffer);
if(msg->id == derived_id)
handle_derived(static_cast<derived*>(msg));
}
derived d;
d.len = sizeof(d);
d.id = deirved_id;
send(&d);
...
char * buffer = get_the_buffer_again();
dispatch(buffer);
它仍然省略了许多方面,但关键部分显示。
是什么让你认为'memcpy'ing对象是C++中的“常见做法”? – 2012-03-17 17:20:05
我不明白你为什么要使用赋值操作符来做其他操作?我很少看到C++ – 111111 2012-03-17 17:21:31
@LightnessRacesinOrbit中的memcpy,因为我已经在很多代码中看到了它。此外,该标准提供了'memcpy'ing对象的规则,但并不能保证这种确切的情况。 – 2012-03-17 17:22:06