Sun Studio 12:C++ 用户指南

1.1 Sun Studio 12 C++ 5.9 编译器的新特性和新功能

本节简要介绍在 Sun Studio 12 C++ 5.9 编译器发行版中引入的 C 编译器的新特性和新功能。有关详细的说明,请参见每项的交叉引用。

1.1.1 为 64 位平台进行编译

在本发行版中,指定 32 位或 64 位二进制的编译的方式已更改。A.2.107 –xarch=isa 选项不再采取隐式内存模式(32 位 ILP32 或 64 位 LP64,使用其各自定义),现在仅用于指定目标处理器的指令集。

请使用新的A.2.50 -m32|-m64选项来指定目标编译的内存模型。

ILP32 模型指定 C 语言的 int、long 和指针数据类型的宽度都是 32 位。LP64 模型指定 long 和指针数据类型的宽度都是 64 位。Solaris 和 Linux OS 还支持 LP64 内存模型下的大型文件和大型数组。

如果使用 -m64 编译,则生成的可执行文件仅能在运行 64 位内核的 Solaris OS 或 Linux OS 下的 64 位 UltraSPARC(R) 或 x86 处理器上运行。64 位对象的编译、链接和执行只能在支持 64 位执行的 Solaris 或 Linux OS 上进行。

1.1.2 x86 特别说明

针对 x86 Solaris 平台进行编译时,有一些重要问题需要了解。

传统的 Sun 样式并行化 pragma 在 x86 上不可用,而改用 OpenMP。有关将传统并行化指令转换为 OpenMP 的信息,请参见《Sun Studio 12: OpenMP API User’s Guide》

如果编译程序时将 -xarch 设置为 ssesse2sse2asse3,则这些程序必须仅在提供这些扩展和功能的平台上运行。

从 Solaris 9 4/04 开始的 Solaris OS 发行版在 Pentium 4 兼容的平台上启用了 SSE/SSE2。早期版本的 Solaris OS 未启用 SSE/SSE2。如果运行的 Solaris OS 中未启用由 -xarch 选择的指令集,编译器将无法为该指令集生成或链接代码。

如果在不同的步骤中进行编译和链接,请始终使用编译器和相同的 -xarch 设置进行链接,以确保链接正确的启动例程。

在 x86 上得到的数值结果可能与在 SPARC 上得到的结果不同,这是由 x86 80 位浮点寄存器造成的。为了最大限度减少这些差异,请使用 -fstore 选项或使用 x-arch=sse2 进行编译(如果硬件支持 SSE2)。

Solaris 和 Linux 的数值结果也可能不同,因为内部数学库(如 sin(x))并不相同。

1.1.3 二进制兼容性验证

从 Sun Studio 11 和 Solaris 10 OS 开始,会对使用这些专用的 -xarch 硬件标志编译和生成的程序二进制文件进行验证,看其是否在适当的平台上运行。

在 Solaris 10 之前的系统中,不执行任何验证,用户负责确保使用这些标志生成的对象部署在合适的硬件上。

如果在没有相应功能或指令集扩展的平台上运行使用这些 -xarch 选项编译的程序,则可能会导致段故障或不正确的结果,并且不显示任何显式警告消息。

此警告还适用于使用利用 SSE、SSE2、SSE2a 和 SSE3 指令和扩展的 .il 内联汇编语言函数或 __asm() 汇编程序代码。