Re: [問題] 關於Class指標的觀念
看板C_and_CPP (C/C++)作者littleshan (我要加入劍道社!)時間11年前 (2013/08/27 22:23)推噓18(18推 0噓 158→)留言176則, 15人參與討論串5/19 (看更多)
※ 引述《descent (「雄辯是銀,沉默是金」)》之銘言:
: 但如果要得到 p (A::func() 的位址)的位址的話,
: 可以使用這樣的方法:
[deleted]
: descent@debian-vm:tmp$ c++filt _ZZ4mainEN1A4funcEv
: main::A::func()
: descent@debian-vm:tmp$ ./c
: p: 0x804856e
: addr: 804856e
: env:
: debian/x86 32 bit 環境
: 我猜 printf 應該也是類似的作法, 才能正確印出 A::func() address。
咈咈咈~~果然有人踩進來了
不過實驗精神可佳 應該賞予坐墊一枚
member function pointer 的陷阱在於這個指標並不能視為一個整數 (講N次了)
我們來看一個應該會讓許多人驚訝的例子
#include <cstdio>
struct A {
virtual void func();
};
void A::func() {...}
int main()
{
void (A::*p)() = &A::func;
printf("addr: %p", p);
return 0;
}
objdump + c++filt:
000000000040094c <A::func()>:
執行結果 (Debian x64 + gcc 4.7.3):
addr: 0x1
所以 A::func 的位址是 0x0000000000000001
這好像不太對 XDDDD
* * *
另一個提示
struct A {
void func();
};
int main()
{
cout << "sizeof(int*) = "<<sizeof(int*) << endl;
cout << "sizeof(&A::func) = " << sizeof(&A::func) << endl;
return 0;
}
在我的電腦上 (Debian x64 + gcc 4.7.3) 是這樣:
sizeof(int*) = 8
sizeof(&A::func) = 16
在 gcc 上,member function pointer 的大小是一般指標的兩倍呢!好開心啊 XD
事實上不同的 compiler 有非常不一樣的實作方法
有的實作和一般指標一樣大,而有的甚至占用四倍或五倍大小!
當然,你不能把 member function pointer 當作一個整數來看
因為除了函式的位址,它還必需儲存一些額外的資訊
才能正確處理 virtual function 與多重繼承
有興趣的可以看看這篇文章 http://goo.gl/2Uc2f
所以各位應該可以理解為什麼 &A::func 不能轉成 int*
這根本是兩個世界的東西
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.39.238.242
推
08/27 22:27, , 1F
08/27 22:27, 1F
→
08/27 22:27, , 2F
08/27 22:27, 2F
→
08/27 22:31, , 3F
08/27 22:31, 3F
推
08/27 22:31, , 4F
08/27 22:31, 4F
→
08/27 22:42, , 5F
08/27 22:42, 5F
推
08/27 22:44, , 6F
08/27 22:44, 6F
→
08/27 22:44, , 7F
08/27 22:44, 7F
推
08/27 22:46, , 8F
08/27 22:46, 8F
→
08/27 22:47, , 9F
08/27 22:47, 9F
→
08/27 22:47, , 10F
08/27 22:47, 10F
→
08/27 22:48, , 11F
08/27 22:48, 11F
→
08/27 22:49, , 12F
08/27 22:49, 12F
推
08/27 22:49, , 13F
08/27 22:49, 13F
→
08/27 22:50, , 14F
08/27 22:50, 14F
→
08/27 22:50, , 15F
08/27 22:50, 15F
→
08/27 22:50, , 16F
08/27 22:50, 16F
→
08/27 22:51, , 17F
08/27 22:51, 17F
→
08/27 22:51, , 18F
08/27 22:51, 18F
→
08/27 22:52, , 19F
08/27 22:52, 19F
→
08/27 22:53, , 20F
08/27 22:53, 20F
→
08/27 22:54, , 21F
08/27 22:54, 21F
推
08/27 22:56, , 22F
08/27 22:56, 22F
→
08/27 22:56, , 23F
08/27 22:56, 23F
→
08/27 22:56, , 24F
08/27 22:56, 24F
→
08/27 22:56, , 25F
08/27 22:56, 25F
→
08/27 23:00, , 26F
08/27 23:00, 26F
→
08/27 23:05, , 27F
08/27 23:05, 27F
→
08/27 23:08, , 28F
08/27 23:08, 28F
→
08/27 23:08, , 29F
08/27 23:08, 29F
→
08/27 23:16, , 30F
08/27 23:16, 30F
→
08/27 23:19, , 31F
08/27 23:19, 31F
→
08/27 23:19, , 32F
08/27 23:19, 32F
→
08/27 23:20, , 33F
08/27 23:20, 33F
→
08/27 23:20, , 34F
08/27 23:20, 34F
→
08/27 23:21, , 35F
08/27 23:21, 35F
→
08/27 23:22, , 36F
08/27 23:22, 36F
→
08/27 23:22, , 37F
08/27 23:22, 37F
→
08/27 23:24, , 38F
08/27 23:24, 38F
推
08/27 23:30, , 39F
08/27 23:30, 39F
還有 97 則推文
→
08/29 23:23, , 137F
08/29 23:23, 137F
→
08/29 23:23, , 138F
08/29 23:23, 138F
→
08/29 23:23, , 139F
08/29 23:23, 139F
→
08/29 23:32, , 140F
08/29 23:32, 140F
→
08/30 00:12, , 141F
08/30 00:12, 141F
→
08/30 00:13, , 142F
08/30 00:13, 142F
→
08/30 00:14, , 143F
08/30 00:14, 143F
→
08/30 00:16, , 144F
08/30 00:16, 144F
→
08/30 00:16, , 145F
08/30 00:16, 145F
→
08/30 00:33, , 146F
08/30 00:33, 146F
→
09/01 06:55, , 147F
09/01 06:55, 147F
→
09/02 11:29, , 148F
09/02 11:29, 148F
推
09/03 18:36, , 149F
09/03 18:36, 149F
→
09/03 18:37, , 150F
09/03 18:37, 150F
→
09/03 18:37, , 151F
09/03 18:37, 151F
→
09/03 18:38, , 152F
09/03 18:38, 152F
→
09/03 18:39, , 153F
09/03 18:39, 153F
→
09/03 18:40, , 154F
09/03 18:40, 154F
→
09/03 18:40, , 155F
09/03 18:40, 155F
→
09/04 19:45, , 156F
09/04 19:45, 156F
→
09/04 19:46, , 157F
09/04 19:46, 157F
→
09/05 01:14, , 158F
09/05 01:14, 158F
推
09/05 09:18, , 159F
09/05 09:18, 159F
→
09/05 09:19, , 160F
09/05 09:19, 160F
→
09/05 23:08, , 161F
09/05 23:08, 161F
→
09/05 23:09, , 162F
09/05 23:09, 162F
→
09/05 23:10, , 163F
09/05 23:10, 163F
→
09/05 23:13, , 164F
09/05 23:13, 164F
→
09/05 23:17, , 165F
09/05 23:17, 165F
→
09/05 23:18, , 166F
09/05 23:18, 166F
→
09/05 23:19, , 167F
09/05 23:19, 167F
→
09/05 23:22, , 168F
09/05 23:22, 168F
→
09/05 23:23, , 169F
09/05 23:23, 169F
→
09/05 23:26, , 170F
09/05 23:26, 170F
→
09/05 23:29, , 171F
09/05 23:29, 171F
推
09/05 23:33, , 172F
09/05 23:33, 172F
→
09/05 23:33, , 173F
09/05 23:33, 173F
→
09/05 23:33, , 174F
09/05 23:33, 174F
→
09/05 23:34, , 175F
09/05 23:34, 175F
→
09/05 23:35, , 176F
09/05 23:35, 176F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章