作者loveme00835 (朴髮箍)
看板C_and_CPP
標題[分享] offsetof on non-static reference member
時間Sat Apr 9 10:26:24 2011
心血來潮想測試一下類別裡的 ref 成員是否可以改變參考到的對象
測試類別:
struct object
{
int &ref;
object(
int &i )
: ref ( i ){ }
};
當小弟一開始寫下:
int i =
10;
object a( i );
int j =
5;
object b( j );
assert( &a.ref != &b.ref );
a = b;
// error!
VC10 & gcc 都會報錯 :
non-static reference member 'int& object::ref', can't
use default assignment operator
用正當的方式不能達到 memberwise copy, 那就用 memcpy 好了:
assert( &a.ref != &b.ref );
memcpy( &a, &b,
sizeof(a) );
assert( &a.ref == &b.ref );
過了! 藉由此方式還是可以改變 ref 參考到的對象, 想要只改變
特定的參考成員:
assert( &a.ref != &b.ref );
memcpy( (
char*)&a + offsetof(object, ref),
(
char*)&b + offsetof(object, ref),
sizeof(
void*) );
assert( &a.ref == &b.ref );
也過了! 只不過 gcc 會給錯誤訊息卻可以正常執行(offsetof):
[Warning] invalid access to non-static data member
'object::ref' of NULL object
VC10則是會保護該區塊不被讀取, 造成執行時期錯誤...(上一例卻
不會? 第二個方法在加入新成員後有可能不會改到)
有關以上行為的規定到了 n3242 似乎也沒有半點著墨...寫 C++還
是蠻危險的...= =
--
▂▅▂ ▁ ● ◣ 朴 ☆ 素 ★ 妍 ◢
◢ ◣ ◢▂▂◣ ◢▂※◣ ◢▄▂◣ T.T.L Listen 2
★ ★ ★ ★ ▉ ★ ★▏▉ ★ ★◣ http://ppt.cc/jIUk
◥ˇ◢ ▃◥ˇ◤▃ ◥ˇ◤ ◥ˇ◤◢ 說什麼結束
▃▃▇▃▃ ◢▇◣ ▋
▎ ▋¥▎ ◢ http://ppt.cc/zQtB
▼ ▼ ▼ ▼ ψ髮箍 ◤ ◣
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
推 holymars:ref都是用pointer實作的,會有這樣的行為很意外嗎.. 04/09 15:02
不意外阿, 所以我才會假設它的大小為 sizeof(void*)
→ holymars:對compiler來說ref就是個他要幫你多做很多處理和判斷的指 04/09 15:03
→ holymars:標,你還要這樣惡搞它 它就雙腳一伸不理你也是合理的 04/09 15:03
→ uranusjr:沒事惡搞編譯器有什麼好處嗎... 04/09 17:37
如果這樣的行為標準裡有定義的很明確, 而不是送你一句
"the behavior is undefined."
那麼使用者就有權這樣作, 甚至還可以達成像C#中Accessor的功能
, 我還要再翻翻有關此類複製行為的規範, 這並不是惡搞..只是想
發掘新用法
※ 編輯: loveme00835 來自: 140.121.197.115 (04/09 19:35)