c++ - 跨平台时如何保证字节对齐
天蓬老师
天蓬老师 2017-04-17 11:57:42
0
3
443

想实现一个跨平台的HEAP或者内存池之类的东西,分配的内存大小是不固定的。
在win32下,HeapAlloc返回的地址总是8的整数倍;在win64下,HeapAlloc返回的地址总是16的整数倍。这个究竟是不是全平台通用的规则还是特例?
Lua源代码里,通过共同体“L_Umaxalign”来实现数据对齐,但是这个最多保证8字节对齐。我想在L_Umaxalign里加入long double实现16字节对齐,但是VC下long double还是8字节的,且在有些编译器下long double是12字节。仍然做不到16字节对齐。
查了一下,貌似win64下heap数据16字节对齐是为某些SSE指令,如果不考虑这个问题,64位平台下8字节对齐是不是也没关系?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回覆(3)
PHPzhong

根本不用考慮這個問題吧?只要你的演算法能相容於不同的對齊策略就可以了。至於不同平台之間的差異,設計網路通訊協定需要考慮,而像記憶體池這種本地程式碼的話根本不必考慮,因為不可能在這台機器上申請記憶體給另一台機器用啊。

Ty80

請參考這個C/C++如何發送包含包體長度和結構體的socket包

左手右手慢动作

為什麼要涉及到記憶體對齊吶?如果你想知道某個類型佔用記憶體的大小,最好就用sizeof.關於記憶體對齊,不同的平台對齊模數不一樣,記憶體佈局也就不一樣。不過有個 #pragma pack(對齊模數)預處理指令,可以用來控制。修改了對齊模數,可能會影響CPU讀取記憶體的速度。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!