是否有任何編譯器的標準佈局類型的佈局要求也不適用於普通可複製類型?特別是,關鍵規則是指向該類型的指針是指向其第一個成員的指針(其中基類將被視爲在派生類之前出現)。也就是說,該類型的地址與其基本類型是相同的地址。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