3 回答

TA貢獻1946條經(jīng)驗 獲得超3個贊
架構(gòu)不必將代碼和數(shù)據(jù)存儲在同一內(nèi)存中。使用哈佛架構(gòu),代碼和數(shù)據(jù)存儲在完全不同的內(nèi)存中。大多數(shù)體系結(jié)構(gòu)都是馮·諾依曼體系結(jié)構(gòu),其中代碼和數(shù)據(jù)位于同一內(nèi)存中,但是C絕不將自身限制為僅某些類型的體系結(jié)構(gòu)。

TA貢獻1877條經(jīng)驗 獲得超1個贊
對于那些記得MS-DOS,Windows 3.1和更早版本的人,答案很簡單。所有這些用于支持幾種不同的內(nèi)存模型,并具有代碼和數(shù)據(jù)指針的特征的不同組合。
因此,例如對于緊湊模型(小代碼,大數(shù)據(jù)):
sizeof(void *) > sizeof(void(*)())
相反,在中型模型中(大代碼,小數(shù)據(jù)):
sizeof(void *) < sizeof(void(*)())
在這種情況下,您沒有代碼和日期的單獨存儲,但是仍然無法在兩個指針之間進行轉(zhuǎn)換(缺少使用非標準的__near和__far修飾符)。
另外,不能保證即使指針大小相同,它們也指向同一事物-在DOS小型內(nèi)存模型中,代碼和數(shù)據(jù)都在指針附近使用,但它們指向的是不同的段。因此,將函數(shù)指針轉(zhuǎn)換為數(shù)據(jù)指針根本不會給您一個與該函數(shù)有任何關(guān)系的指針,因此這種轉(zhuǎn)換毫無用處。
- 3 回答
- 0 關(guān)注
- 755 瀏覽
添加回答
舉報