本章提供了有关当前 Sun Studio C++ 编译器的一般信息:
本节简要介绍在 Sun Studio 12 Update 1 C++ 5.10 编译器发行版中引入的 C 编译器的新特性和新功能。有关详细的说明,请参见每项的交叉引用。
如果应用程序代码中包含带有参数或返回值(使用 _m128/_m64 数据类型)的函数,则在 x86 平台的 Solaris OS 上或 Linux OS 上,编译器创建的目标文件与以前的编译器版本不兼容。使用 .il 内联函数文件、汇编程序代码或调用这些函数的 asm 内联语句的用户也需要注意这种不兼容性。
为 x86 处理器 woodcrest、penryn、nehalem、core2 和 SPARC 处理器 ultraT2plus 及 sparc64vii 新增了 -xtarget 值。
为 x86 体系结构 ssse3、sse4_1、sse4_2 和 SPARC 体系结构 sparcima 新增了 -xarch 值。
为 SPARC 处理器 sparc64vii、ultraT2plus 新增了 —xchip 值。为 x86 处理器 core2、penryn、nehalem 新增了 —xchip 值。
-xprofile=collect 和 -xprofile=use 选项为动态链接的多线程应用程序的文件配置提供了改进的支持。
-xcrossfile=1 选项成为 -xipo=1 选项的别名。-xcrossfile=0 选项不再起任何作用。具体来说,-xcrossfile=1 和 -xcrossfile=0 等效于 -xipo=1。
在 Solaris 平台上,-xpec[=yes|no] 选项会生成可重新编译的 PEC 二进制文件,以用于自动调优系统 (Automatic Tuning System, ATS)。
-Y 选项不接受 i 作为参数。
在 SPARC 平台上,现在针对 x03 或更高优化级别隐式启用 -xdepend 选项,-fast 选项的扩展中不再包括此选项。
OpenMP 3.0 的支持包括 libmtsk 库。缺省情况下,OpenMP 程序将与此库链接,而不是与 Solaris OS 中的 libmtsk 库链接。
-xannotate[=yes|no](仅限 SPARC 平台)指示编译器创建二进制文件,之后这些文件可以由 binopt(1) 之类的二进制文件修改工具进行转换。
现在,在 x86 Solaris 平台上支持 -xia(区间运算)选项。
现在,在 x86 Solaris 平台和 Linux 平台上支持 -xipo_archive 选项。
-Qoption 选项不再接受 ube_ipa 作为参数。
-fast 选项的扩展现在包括 -D_MATHERR_ERRNO_DONTCARE。
现在支持用于显示并行化警告消息的 -xvpara 选项。
-sb、-sbfast、-xsb 和 -xsbfast 选项现已过时,默认忽略。
现在,在优化级别为 -O 或 -xO 的情况下,指定 -g 选项时,只要不同时指定 +d,编译器就会内联代码。
现在支持 pragma must_have_frame。
在标准 C++ 中,switch 语句中的 case 标签只能有一个关联值。Sun Studio C++ 编译器允许在某些编译器中出现扩展,称为 case 范围。
编译器通常在 /tmp 目录中创建临时文件。可以通过设置 TMPDIR 环境变量指定另一个目录。
现在支持函数的以下属性:_attribute_((const)) _attribute_((constructor)) _attribute_((destructor))
现在仅对 struct 类型和 enum 类型支持变量的以下属性:_attribute_((packed))
现在支持通用字符名称。
现在支持循环 pragma。
现在支持用户定义的宏 variadic 参数名称。
添加了用来指定预处理程序 include 文件的 -include filename 选项。
针对 x86 Solaris 平台进行编译时,有一些重要问题值得注意。
传统的 Sun 样式的并行 pragma 在 x86 上不可用。而改用 OpenMP。有关将传统并行化指令转换为 OpenMP 的信息,请参见《Sun Studio 12 Update 1:OpenMP API 用户指南》。
xarch 设置为 -sse、sse2、sse2a、sse3 或更高时编译的程序只能在提供这些扩展和功能的平台上运行。
从 Solaris 9 4/04 开始的 Solaris OS 发行版在 Pentium 4 兼容的平台上支持 SSE/SSE2。早期版本的 Solaris OS 不支持 SSE/SSE2。如果所运行的 Solaris OS 不支持由 -xarch 选定的指令集,则编译器无法为该指令集生成链接代码。
如果在不同的步骤中进行编译和链接,请始终使用编译器和相同的 -xarch 设置进行链接,以确保链接正确的启动例程。
在 x86 上得到的数值结果可能与在 SPARC 上得到的结果不同,这是由 x86 80 位浮点寄存器造成的。为了最大限度减少这些差异,请使用 -fstore 选项或使用 -xarch=sse2 进行编译(如果硬件支持 SSE2)。
Solaris 和 Linux 之间的数值结果也可能不同,因为内部数学库(例如,sin(x))并不相同。
使用 —m32 选项可针对 ILP32 32 位模型进行编译。使用 —m64 选项可针对 LP64 64 位模型进行编译。
ILP32 模型指定 C++ 语言的 int、long 和 pointer 数据类型的宽度均为 32 位。LP64 模型指定 long 和 pointer 数据类型均为 64 位。Solaris 和 Linux OS 还支持 LP64 内存模型下的大型文件和大型数组。
如果使用 —m64 进行编译,则生成的可执行文件仅能在运行 64 位内核的 Solaris OS 或 Linux OS 下的 64 位 UltraSPARC 或 x86 处理器上运行。64 位对象的编译、链接和执行只能在支持 64 位执行的 Solaris 或 Linux OS 上进行。
在 Solaris 系统上,从 Sun Studio 11 开始,Sun Studio 编译器编译的程序二进制文件都标记了体系结构硬件标志(表示由编译的二进制文件采用的指令集)。在运行时,会检查这些标记标志以确认二进制文件是否可在尝试在其上执行的硬件上运行。
如果程序不包含这些体系结构硬件标志,或者如果平台没有启用适当的功能或指令集扩展,则运行此程序可能会导致段故障或错误结果,且不会显示任何显式警告消息。
这一警告还会扩展到采用 .il 内联汇编语言函数或 __asm() 汇编程序代码(利用 SSE、SSE2、SSE2a、SSE3 和更新的指令及扩展)的程序。
C++ 编译器 (CC) 支持 C++ ISO 国际标准 ISO IS 14882:2003 编程语言-C++。当前发行版本附带的自述文件描述了与标准需求的所有差异。
在 SPARCTM 平台上,编译器提供了对 SPARC V8 和 SPARC V9(包括 UltraSPARC 实现)优化开发功能的支持。在 Prentice-Hall for SPARC International 发行的第 8 版 (ISBN 0-13-825001-4) 和第 9 版 (ISBN 0-13-099227-5) SPARC Architecture Manual 中定义了这些功能。
在本文档中,“标准”是指与上面列出的标准版本相一致。“非标准”或“扩展”是指这些标准的这些版本之外的功能。
负责标准的一方可能会不时地修订这些标准。C++ 编译器兼容的适用标准版本可能被修订或替换,这将会导致以后的 Sun C++ 编译器发行版本在功能上与旧的发行版本产生不兼容。
C++ 编译器的自述文件列出了关于编译器的重要信息,其中包括:
在手册印刷之后发现的信息
新特性和更改的特性
软件更正
问题和解决办法
限制和不兼容
可发送库
未实现的标准
可以在 Sun Developer Network Sun Studio 门户网站 http://developers.sun.com/sunstudio/documentation 上找到此 Sun Studio 发行版及早期发行版的 C++ 编译器自述文件。
联机手册 (man) 页提供了关于命令、函数、子例程以及收集这些信息的文档。
可以通过运行以下命令来显示手册页:
example% man topic |
在整个 C++ 文档中,手册页参考都以主题名称和手册节编号表示:通过 man CC 访问 CC(1)。例如,可在 man 命令中使用 -s 选项来访问 ieee_flags(3M) 指示的其他部分:
example% man -s 3M ieee_flags |
此发行版本的 C++ 支持使用英语以外的其他语言进行应用程序的开发,包括了大多数欧洲语言和日语。因此,您可以十分便捷地将应用程序从一种语言切换到另一种语言。此功能被称为国际化。
通常,C++ 编译器按如下方式实现国际化:
C++ 从国际化的键盘识别 ASCII 字符(也就是说,它具有键盘独立性和 8 位清除)。
C++ 允许使用本地语言打印某些消息。
C++ 允许在注释、字符串和数据中使用本地语言。
C++ 只支持符合扩展 UNIX 字符 (Extended UNIX Characte, EUC) 的字符集,在该字符集中,字符串内每个空字节是一个空字符,而字符串内每个 ascii 值为 "/" 的字节是一个 "/" 字符。
变量名称不能国际化,必须使用英文字符集。
您可以设置语言环境将应用程序从一种本地语言更改为另一种语言。关于这一点和其他本地语言支持功能的信息,请参见操作系统文档。