作者StubbornLin (Victor)
看板C_and_CPP
標題[問題] C/C++的new申請出來的記憶體位址保證對齊嗎?
時間Tue Feb 3 17:32:55 2009
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
1F:推 yoco315:完全看實做品高興… 02/03 20:46
2F:→ yoco315:Digital Mars 的 C++ compiler 還可以用參數指定要多少 02/03 20:47
3F:推 yoco315:簡單的解法是:不要寫出依賴這種東西的 code 02/03 20:49
4F:推 tinlans:new 底層大都是 call C++ std lib,所以 lib 怎麼寫就是 02/03 20:51
5F:→ tinlans:怎樣,基本上寫 lib 的人會考慮機器有沒有支援沒對齊的指 02/03 20:51
7F:→ tinlans:令,如果機器本身沒支援的話通常就是會對齊。 02/03 20:52
8F:→ tinlans:CPU 支援,插的卡不支援,那結果還是要自己搞對齊就是。 02/03 20:52
9F:→ layan:若你用VC Compiler, try _aligned_malloc 02/03 21:58
11F:→ StubbornLin:可是stackoverflow有人回答標準有規定耶 囧 02/03 22:18
12F:→ tinlans:標準是說要能轉成任何 type 的 pointer,像是 char * 轉 02/04 23:03
13F:→ tinlans:int * 要可以轉,有些機器要求 word 定址對齊 32-bit 邊界 02/04 23:03
14F:→ tinlans:,要是 char * 是 0x70000001,轉 int * 就會有問題。 02/04 23:04
15F:→ tinlans:compiler 只能生出很多指令來達成相同目的,但你 runtime 02/04 23:05
16F:→ tinlans:得來的 pointer value,compiler 無法預測,故有此標準。 02/04 23:05