Re: [問題] hw1.2.p1b(iv)

作者: ric2k1 (Ric)   2013-10-05 16:38:55
arr1b_3 的型態是 P1a **,所以它的 content 應該是一個 P1a* 指標,
也就是說每個 arr1b_3[i] 都會指到一個 P1a 的記憶體。
[Note] P1a 的 size 應該是 16 Bytes, 而非 8 Byte,
sizeof(*(arr1b_3[i])) 看到的是 sizeof (P1a *),而非 sizeof (P1a))。
所以,理論上每個 arr1b_3[i] 的內容只要存一個 address,
arr1b_3[i] 以及 arr1b_3[i+1] 的值應該只差 4 or 8,
for 32- or 64-bit machine, respectively.
但是為什麼差了 16 or 32 呢?
你可以作一個小實驗:
#include <string>
#include <iostream>
using namespace std;
class A
{
int _dummy;
string _str;
};
int main()
{
A *a1 = new A;
A *a2 = new A;
cout << hex << a1 << endl;
cout << hex << a2 << endl;
}
你也會發現印出來的 address 也是差了 16 or 32 (for 32 or 64-bit machine).
結論就是,兩個不同的變數,即使是連在一起,當他們都用 new 去 allocate 的時候,
本來就不會 guarantee 系統會分配給你連續的記憶體位置,至於系統那去做什麼,
(記憶體管理?) 恐怕就要請大家一起來研究一下了!
※ 引述《nianze (念澤)》之銘言:
: 標題: [問題] hw1.2.p1b(iv)
: 時間: Sat Oct 5 12:02:53 2013
:
: 這題我作到print out the contents of arr1b_3[5]時
:
: 發現間隔大小變成16bytes
:
: 如下:
: Contents of arr1b_3[5] are:
: arr1b_3[0]: 0x80f1050
: arr1b_3[1]: 0x80f1060
: arr1b_3[2]: 0x80f1070
: arr1b_3[3]: 0x80f1080
: arr1b_3[4]: 0x80f1090
:
: 但P1a的大小應該是8bytes
:
: 所以我用sizeof(*(arr1b_3[i]))去看他的大小
:
: 發現是8bytes無誤
:
: 想請問為何這裡記憶體的配置會不連續?
:
: 謝謝大家
:
:
作者: nianze (念澤)   0000-00-00 00:00:00
請問為甚麼P1a的大小是16bytes?我用sizeof(P1a)得到8bytes而且string+int=8bytes好像很合理?請老師再多解釋一點謝謝另外,既然arr1b_3[i]是P1a*,那derefernce後不就是P1a了嗎

Links booklink

Contact Us: admin [ a t ] ucptt.com