[問題] C/C++的new申請出來的記憶體位址保證對齊嗎?

看板C_and_CPP作者 (Victor)時間15年前 (2009/02/03 17:32), 編輯推噓3(3013)
留言16則, 4人參與, 最新討論串1/1
http://blog.ez2learn.com/2009/02/03/data-alignment/ 記憶體位對齊資料的存取會比較快 我記得以前記得好像看到有人的程式申請記憶體時會故意申請大一點的 然後再來進行位址對齊 只用對齊的位址當開頭 可是我總覺得我如果是寫c++的runtime 像是new我可能在設計時 就讓它傳回來的位址都是對齊好的 我寫了程式下去試 for(size_t i = 0; i < 100; ++i) { char *p = new char[123]; if(reinterpret_cast<size_t>(p) % 4) { cout << "*"; system("pause"); } cout << reinterpret_cast<void *>(p) << endl; } for(size_t i = 0; i < 100; ++i) { short *p = new short[123]; if(reinterpret_cast<size_t>(p) % 4) { cout << "*"; system("pause"); } cout << reinterpret_cast<void *>(p) << endl; } for(size_t i = 0; i < 100; ++i) { float *p = new float[123]; if(reinterpret_cast<size_t>(p) % 4) { cout << "*"; system("pause"); } cout << reinterpret_cast<void *>(p) << endl; } system("pause"); 我發現的確new出來都是對齊好的 但是我不敢確定 所以想請問一下 c++的new有保證對齊嗎? 我用的是Visual C++ Express 2008 還是雖然沒規定 但它的runtime實作保證對齊? 以上 謝謝 -- 哇咧咧 創意投票系統 http://walele.com 易記學 程式設計教學 http://ez2learn.com/ 易記學 程式設計討論區 http://forum.ez2learn.com VICTOR's 個人Blog http://blog.ez2learn.com/ 財報分析王 http://victorlin.serveftp.org/stock/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.113.156.83

02/03 20:46, , 1F
完全看實做品高興…
02/03 20:46, 1F

02/03 20:47, , 2F
Digital Mars 的 C++ compiler 還可以用參數指定要多少
02/03 20:47, 2F

02/03 20:49, , 3F
簡單的解法是:不要寫出依賴這種東西的 code
02/03 20:49, 3F

02/03 20:51, , 4F
new 底層大都是 call C++ std lib,所以 lib 怎麼寫就是
02/03 20:51, 4F

02/03 20:51, , 5F
怎樣,基本上寫 lib 的人會考慮機器有沒有支援沒對齊的指
02/03 20:51, 5F

02/03 20:52, , 6F
如果你真的要,參考這個作法 http://tinyurl.com/6n3ono
02/03 20:52, 6F

02/03 20:52, , 7F
令,如果機器本身沒支援的話通常就是會對齊。
02/03 20:52, 7F

02/03 20:52, , 8F
CPU 支援,插的卡不支援,那結果還是要自己搞對齊就是。
02/03 20:52, 8F

02/03 21:58, , 9F
若你用VC Compiler, try _aligned_malloc
02/03 21:58, 9F

02/03 22:18, , 10F
02/03 22:18, 10F

02/03 22:18, , 11F
可是stackoverflow有人回答標準有規定耶 囧
02/03 22:18, 11F

02/04 23:03, , 12F
標準是說要能轉成任何 type 的 pointer,像是 char * 轉
02/04 23:03, 12F

02/04 23:03, , 13F
int * 要可以轉,有些機器要求 word 定址對齊 32-bit 邊界
02/04 23:03, 13F

02/04 23:04, , 14F
,要是 char * 是 0x70000001,轉 int * 就會有問題。
02/04 23:04, 14F

02/04 23:05, , 15F
compiler 只能生出很多指令來達成相同目的,但你 runtime
02/04 23:05, 15F

02/04 23:05, , 16F
得來的 pointer value,compiler 無法預測,故有此標準。
02/04 23:05, 16F
文章代碼(AID): #19Y0z9VR (C_and_CPP)