討論區快速選單
知識庫快速選單
網路投保旅行平安險 傑米的攝影旅遊筆記 政府補助!學嵌入式+物聯網
[ 回上頁 ] [ 討論區發言規則 ]
記憶體之問
更改我的閱讀文章字型大小
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/8 下午 04:45:36
假如一個記憶體 (假如是0022FC41
沒被編譯器分配來給程式用
然後輸入值給該記憶體,
這樣一定出錯,我試過了,但我的問題不在這

請問雖然0022FC41沒被分配給程式用,
但0022FC41還是存在吧?

只是沒被分配給程式用,才出錯
是這樣嗎?
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人kotty123註記此篇回應為很有道理 2015/11/8 下午 11:54:35
意圖存取不在你程式控制下的記憶體都會導致不可預期的結果.
作者 : jasper(Jasper)討論區板主 程式設計甘苦談頂尖高手上班族的哈拉園地優秀好手貼文超過1000則人氣指數超過70000點
[ 貼文 1408 | 人氣 96053 | 評價 6990 | 評價/貼文 4.96 | 送出評價 42 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/9 上午 09:11:11
編譯器會分配記憶體嗎?
應該是執行時才分配的。
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/9 上午 11:39:42

>編譯器會分配記憶體嗎?
>應該是執行時才分配的。
>


這我不清楚
不是編譯器分配記憶體給程式用的嗎
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/9 下午 12:02:55
the goal of compiler is responsible for translating high level languages to low level languages.
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/9 下午 07:11:27
https://en.wikipedia.org/wiki/Segmentation_fault
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/9 下午 08:52:43
>請問雖然0022FC41沒被分配給程式用,
>但0022FC41還是存在吧?

那又怎樣? 你手上有地址並不表示你可以隨便進入別人的家!

作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人kotty123註記此篇回應為最佳解答 2015/11/11 下午 01:24:51
>這我不清楚
>不是編譯器分配記憶體給程式用的嗎
這要看什麼用途的編譯器。
如果你用一個獨立程式編譯器(例如很多for embedded system),運行時整個系統就只有你一個程式。
這個編譯器在連結後確實會定址並配置記憶體給程式。其它未被定址分配的記憶體,程式去存取它也不會怎麼。
但如果是運行一個os底下的程式,那麼編譯連結完成只是配置大小。程式最後定址在何處是由OS的loader決定的。
而且整個系統,除了OS,和你的程式在運行外,可能還有很多其它的程式在同一個系統裡運行。
沒配置給你的記憶體,程式當然不能隨便亂用。
就像開飛機,塔台要你使用2號跑道,你WW認為,雖然沒分配1號和3號跑道給我,但這兩個跑道還是存在的啊。
我去使用它們會有什麼問題?問題不大,就是會撞機而已。
作者 : kennytsai(Kenny) C++卓越專家貼文超過500則
[ 貼文 720 | 人氣 2903 | 評價 2840 | 評價/貼文 3.94 | 送出評價 140 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/1/17 上午 01:36:52
>請問雖然0022FC41沒被分配給程式用,但0022FC41還是存在吧?

1. 以目前CPU/MCU的發展來說,MMU的使用、早已深入各個領域,只有很低階的系統,才會直接使用真實記憶體位址。
2. 簡單的說,應用程式所看到的位址,例如你所提到的「0x0022FC4x」,只是一個「虛擬」的位址,在某些極端應用上,這個位址可能對應的是你硬碟上的空間。
3. 深入一點來說,新一代的CPU架構內含L1/L2/L3 Cache(各位手上的Smart Phone已經是這樣的架構了),且DDR3/DDR4的實際定址方式需透過Row/Column/Bank、以區塊為單位來讀寫,記憶體並非連續性的(Flat memory)排列,這裡面有很多複雜的技術,好在有作業系統的存在,我們不用傷腦筋。
4. 這麼說好了,當你透過malloc函式、配置了1MB的記憶體後,從程式的觀點來看,這是連續的空間,但實際對應到真實的硬體時,卻可能是好幾個區塊的組合。這背後的關鍵是OS、MMU、TLB、...等等。
5. 0x0022FC41是一個奇數位址,這個位址在x86系統是ok的,但有許多他廠的CPU會出現水土不服,不過,這只是題外話。這個沒被分配的位址是否存在呢?希望你已經有了答案。

Good Luck!
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/1/18 下午 02:39:11

>5. 0x0022FC41是一個奇數位址,這個位址在x86系統是ok的,但有許多他廠的CPU會出現水土不服,不過,這只是題外話。這個沒被分配的位址是否存在呢?希望你已經
     ^^^^^^^^^^^^^^^^^^ , may I ask you why x86 chip allows an odd address ?
作者 : igbt(IGBT)
[ 貼文 7 | 人氣 0 | 評價 10 | 評價/貼文 1.43 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/1/18 下午 07:02:53

>
>>5. 0x0022FC41是一個奇數位址,這個位址在x86系統是ok的,但有許多他廠的CPU會出現水土不服,不過,這只是題外話。這個沒被分配的位址是否存在呢?希望你已經
> ^^^^^^^^^^^^^^^^^^ , may I ask you why x86 chip allows an odd address ?
>
#pragma pack(push,1)
struct {
char a0; // 1byte
int a1; // 4byte
short int a5; // 2byte
} tST
#pragma pack(pop)

資料傳輸封包常用ok
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/1/18 下午 09:11:15
#pragma pack(push,1)
-- this is a compiler preprocessor instruction , it is not x86 cpu addressing mode.
it is a memory alignment .
作者 : igbt(IGBT)
[ 貼文 7 | 人氣 0 | 評價 10 | 評價/貼文 1.43 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/1/19 上午 10:51:44
>it is a memory alignment .
yes

#pragma pack(push,1)
struct {
char a0; // 1byte
int a1; // 4byte
short int a5; // 2byte
} tST
#pragma pack(pop)

char *p0 = &tST.a0; // even address
int *p1 = &tST.a1; // odd address
short int *p5 = &tST.a5;// odd address

int i = *p1; // x86 ok, ARM alignment exception
short int j = tST.a5; // x86 ok, ARM alignment exception

作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/1/20 下午 05:46:37
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491c/CJAFEEDG.html
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/1/21 下午 01:44:00
http://en.cppreference.com/w/cpp/io/basic_ios/exceptions
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/1/21 下午 02:48:43
回覆1:
>may I ask you why x86 chip allows an odd address ?
確實是這樣的。
x86 的bus有16,32.64元之分,以16位元的8086來說明:
當指令要求讀取一個奇數位址16位元資料,例如0x123時,
CPU會分成讀取0x122和0x124兩個讀取時序,然後將0x122讀到的16位元資料後8位元資料和0x124的前8位元資料合併成
指令要讀取的0x123的16位元資料。
寫入奇數位址16位元資料,情況是一樣的。
當然可想見這樣的分次存取,一定會降底CPU的運行效率。

回覆2:
>#pragma pack(push,1)
>:::::::::::::::::::::::::::
>#pragma pack(pop)
>資料傳輸封包常用ok
沒用預設(最佳)的aligment,會導致效率降底,不要以為沒什不同(解釋如回覆1)。

>0x0022FC41是一個奇數位址,這個位址在x86系統是ok的,但有許多他廠的CPU會出現水土不服
不是這麼說,不允計邊界外地址存取的CPU,都會產生Exception(至少我知道的都是這樣)。
OS標準的做法,會攔截這個Exception,然後用軟體做像x86所做的事情一樣(分次存取和組合)。
結果還是可以正確的讀取非邊界址,只是其效率比x86更差。
沒有OS的程式,如很多embeded AP,除應用程式本身,沒有上層的OS可以handle 非邊界存取的Exception。
通常的做法也是自己寫一個Exception的處理常式來應付非邊界存取。
這類CPU的關念是把非邊界存取交給軟體,可以做較彈性處理。並不應該視為水土不服。


 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 13050 
2 青衫 4760 
3 simula 4690 
4 coco 4030 
5 白老鼠(Gary) 3670 
6 ozzy 2540 
7 Ben 2250 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1560 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.203125