c++ - 跨平台时如何保证字节对齐

 刺客狙侠者 发布于 2022-11-04 18:20

想实现一个跨平台的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 个回答
  • 为什么要涉及到内存对齐呐?如果你想知道某个类型占用内存的大小,最好就用sizeof.关于内存对齐,不同的平台对齐模数不一样,内存布局也就不一样。不过有个 #pragma pack(对齐模数)预处理指令,可以用来控制。修改了对齐模数,可能会影响CPU读取内存的速度。

    2022-11-08 14:15 回答
  • 请参考一下这个C/C++如何发送包含包体长度和结构体的socket包

    2022-11-08 14:21 回答
  • 根本不用考虑这个问题吧?只要你的算法能兼容不同的对齐策略就可以了。至于不同平台之间的差异,设计网络通讯协议需要考虑,而像内存池这种本地代码的话根本不必考虑,因为不可能在这台机器上申请内存给另一台机器用啊。

    2022-11-08 14:22 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有