内存分配
当您将程序迁移到 时,可能会出现 IBM®Open XL C/C++ for AIX®17.1.0 堆内存分配问题。
17.1.0Open XL C/C++ for AIXIBM 默认预定义该
__VEC__ 宏,因为编译器支持 POWER7 及更高版本的处理器。 除非宏被其他宏 (例如 _XOPEN_SOURCE) 禁止,否则 _ALL_SOURCE 宏由 AIX 系统头定义。 定义 __VEC__ 和 _ALL_SOURCE 宏时, malloc 和 calloc 系统调用将分别映射到 AIX 系统头文件 /usr/include/stdlib.h中的 vec_malloc 和 vec_calloc 。注: 定义
__VEC__ 和 _ALL_SOURCE 宏时,将忽略 _LINUX_SOURCE_COMPAT 宏对 malloc 和 calloc 系统调用的影响。malloc 和 calloc 系统调用提供 8 字节对齐分配,而 vec_malloc 和 vec_calloc 则提供 16 字节对齐分配。 在 malloc 和 calloc 映射到 vec_malloc 和 vec_calloc 后,如果应用程序进行大量的小堆分配,那么堆内存消耗会大大增加,这将导致应用程序意外地耗尽内存(如果构建该应用程序时使用了某个 maxdata 值)。
要解决此问题,请尝试以下其中一个方法:
- 在不使用
_ALL_SOURCE宏的情况下编译程序,并在需要 16 字节对齐的位置显式调用vec_malloc、vec_calloc或posix_memalign系统调用。 - 使用 -mno-altivec 选项编译程序。
- 如果上述方法不可行,那么对于 32 位应用程序,将生成的应用程序与更大的 -bmaxdata 值进行链接,以容纳由于
vec_malloc和vec_calloc而需要的额外空间。 例如,如果您最初指定了 -bmaxdata:0x80000000,那么需要将该设置更改为更大的值,例如 -bmaxdata:0xa0000000/dsa。 实际的额外内存量取决于应用程序分配堆内存的方式。 - 对于现有二进制文件,请使用
LDR_CNTRL环境变量或ldedit命令来设置新的maxdata值。 有关详细信息,请参阅大型程序支持。