Anonymous
Anonymous asked in 電腦與網際網路程式設計 · 2 decades ago

急!!!VB的問題~~

請問大大

1. int age[5][6];

(a) 就VB而言,請問總共佔用多少記憶體?

(b) 若age[0][0]的位址是100,請問age[2][3] 的位址?

2 Answers

Rating
  • 2 decades ago
    Favorite Answer

    雖然問題是有點奇怪, 不過假設你指的

    int age[5][6] 相當於VB的 Dim age(5, 6) as Integer, 又假設option base 0 (VB預設值)

    以C的觀點而言(Unix), 一個int是32bit(即4bytes), 所以age array佔了(5*6)*4bytes = 120 bytes. 因為C的陣列直接掌控記憶體, 所以沒有任何overhead.

    但VB就不一樣了. VB利用低階的API系統呼叫來宣告特別的記憶體區塊(稱為安全陣列區塊Safe Array), 所以每一個陣列, 不管多大多複雜, 都會先佔用20 bytes的空間來存放管理資料, 然後每一維多加8 bytes的管理成本, 最後再加上實際所需的記憶體. 也就是說,

    Dim age(5, 6) as Integer, 共有42個Integer(0..5, 0..6), 一個Integer是16bit, 即2 bytes, 所以實際需要的記憶體為 6*7*2bytes = 84 bytes.

    age是一個二維陣列, 所以需要多 8 bytes *2 = 16 bytes.

    再加上Safe Array 的 overhead 20 bytes,

    所以一共是 84 + 16 + 20 = 120 bytes.

    在VB的陣列中, age(0, 0)並不是陣列起始的地方, 而是第一個陣列元素資料的記憶體位置. VB的陣列在記憶體的位置儲存方式, 以age陣列而言是:

    (0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (5, 0),

    (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1),

    (0, 2), (1, 2), (2, 2), (3, 2), (4, 2), (5, 2),

    (0, 3), (1, 3), (2, 3), (3, 3), (4, 3), (5, 3),

    ...

    所以age(2, 3)是在150的位址.

    提醒你: VB是用little-endian的方式儲存, 所以在做memory dump時, 每個元素數值的first byte跟last byte要重新組合.

    如果你假設的位址100代表的是age陣列的起始位址, 那計算就不一樣了. 因為你要把Safe Array的overhead 資料區塊也一併算進去. 即:

    age(0, 0)的實際位址為100+20 (Safe Array control info) + 8*2 (dimension info) = 136.

    age(2, 3)的offset 為50, 所以 age(2, 3)的實際位址為186.

    希望以上資料真的對你有幫助.

    Source(s): How Visual Basic 6 Stores Data http://www.codeguru.com/vb/gen/vb_misc/algorithms/...
  • 2 decades ago

    你這是C的問題吧....怎麼看都不是VB的問題呀...如果要「就VB而言」的話請換成Basic敘述好嗎=w=

Still have questions? Get your answers by asking now.