内存分配

当您将程序迁移到 时,可能会出现 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 宏时, malloccalloc 系统调用将分别映射到 AIX 系统头文件 /usr/include/stdlib.h中的 vec_mallocvec_calloc
注: 定义 __VEC___ALL_SOURCE 宏时,将忽略 _LINUX_SOURCE_COMPAT 宏对 malloccalloc 系统调用的影响。

malloccalloc 系统调用提供 8 字节对齐分配,而 vec_mallocvec_calloc 则提供 16 字节对齐分配。 在 malloccalloc 映射到 vec_mallocvec_calloc 后,如果应用程序进行大量的小堆分配,那么堆内存消耗会大大增加,这将导致应用程序意外地耗尽内存(如果构建该应用程序时使用了某个 maxdata 值)。

要解决此问题,请尝试以下其中一个方法:
  1. 在不使用 _ALL_SOURCE 宏的情况下编译程序,并在需要 16 字节对齐的位置显式调用 vec_mallocvec_callocposix_memalign 系统调用。
  2. 使用 -mno-altivec 选项编译程序。
  3. 如果上述方法不可行,那么对于 32 位应用程序,将生成的应用程序与更大的 -bmaxdata 值进行链接,以容纳由于 vec_mallocvec_calloc 而需要的额外空间。 例如,如果您最初指定了 -bmaxdata:0x80000000,那么需要将该设置更改为更大的值,例如 -bmaxdata:0xa0000000/dsa。 实际的额外内存量取决于应用程序分配堆内存的方式。
  4. 对于现有二进制文件,请使用 LDR_CNTRL 环境变量或 ldedit 命令来设置新的 maxdata 值。 有关详细信息,请参阅大型程序支持