C / C++ / C++11 编译改用 x32 ABI

Menci 于 2018-01-13 21:48:32 发表,2018-05-22 16:47:24 最后更新

什么是 x32 ABI

简言之,x32 ABI 就是使 64 位平台上的程序使用 32 位指针(sizeof(void *) = 4)的一种架构。

Linux 下 GCC 系列编译器通过添加 -mx32 选项来使用 x32 ABI。

它和 -m32 有什么区别?

-m32 表示编译为 32 位代码,如果在 64 位平台上这样做,将导致大约一半的寄存器无法被利用,并且 64 位整数运算的效率会降低。而 -mx32 则只是将指针类型变为 4 字节。

为什么要这么做?

为了更好地模拟 NOI 系列比赛的环境(指针类型为 4 字节),避免将一些原本在 32 位比赛环境下的题目(多数是数据结构题)的内存限制翻倍而带来的其他问题,而又不损失 64 位评测机的性能。

它对我有什么影响?

理论上,这一改动所带来的唯一不利影响是你将最多使用 2 GB 的内存 —— 但这已经超过了 LibreOJ 允许的题目内存限制上限(1 GB),所以,实际上,这对你提交的代码的评测不会有任何不利影响。

4 字节的指针类型可能能给程序运行效率带来常数级别的提升(相对于 8 字节),同时你不再需要担心在 32 位平台下编写的程序会在 LibreOJ 上占用更大的内存。

我在本地应该怎么做?

如果你在本地运行 32 位操作系统,则恭喜你,不需要做出任何的改动。

如果你在本地运行 64 位 Linux 操作系统,你可以通过在 g++gcc 命令参数中添加 -mx32 来与 LibreOJ 保持一致。你可以查看帮助来了解 LibreOJ 编译 C / C++ / C++11 代码时使用的完整命令行。

如果你在本地运行 64 位 Windows 或 macOS,则很遗憾,这些操作系统并不支持 x32 ABI,如果你需要与 LibreOJ 一致的内存统计,请使用 -m32 编译选项来代替,注意这将引起(微量的)性能损失。

共 7 条回复

negiizhao

应该是最多使用4GB内存吧..

tututu

后排滋磁

Bill_Yang

前排围观

cdcq

jjikkollp

沙发+前排滋磁

Zrj

前排滋磁

oscar

沙发+前排滋磁