选项怎么设置虚拟内存

怎么设置虚拟内存  时间:2021-01-16  阅读:()

OracleSolarisStudio12.
3:C++用户指南文件号码E264392011年12月,E26439-01版权所有1991,2011,Oracle和/或其附属公司.
保留所有权利.
本软件和相关文档是根据许可证协议提供的,该许可证协议中规定了关于使用和公开本软件和相关文档的各种限制,并受知识产权法的保护.
除非在许可证协议中明确许可或适用法律明确授权,否则不得以任何形式、任何方式使用、拷贝、复制、翻译、广播、修改、授权、传播、分发、展示、执行、发布或显示本软件和相关文档的任何部分.
除非法律要求实现互操作,否则严禁对本软件进行逆向工程设计、反汇编或反编译.

此文档所含信息可能随时被修改,恕不另行通知,我们不保证该信息没有错误.
如果贵方发现任何问题,请书面通知我们.

如果将本软件或相关文档交付给美国政府,或者交付给以美国政府名义获得许可证的任何机构,必须符合以下规定:U.
S.
GOVERNMENTENDUSERS:Oracleprograms,includinganyoperatingsystem,integratedsoftware,anyprogramsinstalledonthehardware,and/ordocumentation,deliveredtoU.
S.
Governmentendusersare"commercialcomputersoftware"pursuanttotheapplicableFederalAcquisitionRegulationandagency-specificsupplementalregulations.
Assuch,use,duplication,disclosure,modification,andadaptationoftheprograms,includinganyoperatingsystem,integratedsoftware,anyprogramsinstalledonthehardware,and/ordocumentation,shallbesubjecttolicensetermsandlicenserestrictionsapplicabletotheprograms.
NootherrightsaregrantedtotheU.
S.
Government.
本软件或硬件是为了在各种信息管理应用领域内的一般使用而开发的.
它不应被应用于任何存在危险或潜在危险的应用领域,也不是为此而开发的,其中包括可能会产生人身伤害的应用领域.
如果在危险应用领域内使用本软件或硬件,贵方应负责采取所有适当的防范措施,包括备份、冗余和其它确保安全使用本软件或硬件的措施.
对于因在危险应用领域内使用本软件或硬件所造成的一切损失或损害,OracleCorporation及其附属公司概不负责.
Oracle和Java是Oracle和/或其附属公司的注册商标.
其他名称可能是各自所有者的商标.
Intel和IntelXeon是IntelCorporation的商标或注册商标.
所有SPARC商标均是SPARCInternational,Inc的商标或注册商标,并应按照许可证的规定使用.
AMD、Opteron、AMD徽标以及AMDOpteron徽标是AdvancedMicroDevices的商标或注册商标.
UNIX是TheOpenGroup的注册商标.
本软件或硬件以及文档可能提供了访问第三方内容、产品和服务的方式或有关这些内容、产品和服务的信息.
对于第三方内容、产品和服务,OracleCorporation及其附属公司明确表示不承担任何种类的担保,亦不对其承担任何责任.
对于因访问或使用第三方内容、产品或服务所造成的任何损失、成本或损害,OracleCorporation及其附属公司概不负责.
120220@25097目录前言19第1部分C++编译器231C++编译器251.
1OracleSolarisStudio12.
3C++5.
12编译器的新特性和新功能251.
2x86特殊注意事项261.
3针对64位平台进行编译261.
4二进制兼容验证271.
5标准符合性271.
6发行版信息271.
7手册页281.
8本地语言支持282使用C++编译器292.
1入门292.
2调用编译器302.
2.
1命令语法302.
2.
2文件名称约定312.
2.
3使用多个源文件322.
3使用不同编译器版本进行编译322.
4编译和链接322.
4.
1编译和链接序列322.
4.
2分别编译和链接332.
4.
3一致编译和链接332.
4.
4针对64位内存模型进行编译332.
4.
5编译器命令行诊断3432.
4.
6了解编译器的组织342.
5预处理指令和名称352.
5.
1Pragma352.
5.
2具有可变数目的参数的宏352.
5.
3预定义的名称362.
5.
4警告和错误362.
6内存要求362.
6.
1交换空间大小372.
6.
2增加交换空间372.
6.
3虚拟内存的控制372.
6.
4内存要求382.
7将strip命令用于C++目标382.
8简化命令382.
8.
1在CShell中使用别名382.
8.
2使用CCFLAGS指定编译选项392.
8.
3使用make393使用C++编译器选项413.
1语法概述413.
2通用指南413.
3按功能汇总的选项423.
3.
1代码生成选项423.
3.
2编译时性能选项433.
3.
3编译时选项和链接时选项433.
3.
4调试选项443.
3.
5浮点选项453.
3.
6语言选项463.
3.
7库选项463.
3.
8已过时选项473.
3.
9输出选项483.
3.
10运行时性能选项493.
3.
11预处理程序选项503.
3.
12分析选项513.
3.
13参考选项513.
3.
14源文件选项51目录OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0143.
3.
15模板选项513.
3.
16线程选项523.
4用户提供的缺省选项文件52第2部分编写C++程序554语言扩展574.
1链接程序作用域574.
1.
1与MicrosoftWindows兼容584.
2线程局部存储594.
3用限制较少的虚函数覆盖594.
4对enum类型和变量进行前向声明604.
5使用不完整enum类型604.
6将enum名称作为作用域限定符604.
7使用匿名struct声明614.
8传递匿名类实例的地址624.
9将静态名称空间作用域函数声明为类友元624.
10将预定义__func__符号用于函数名634.
11支持的属性634.
11.
1__packed__属性详细信息644.
12对IntelMMX和扩展的x86平台内部函数的编译器支持655程序组织675.
1头文件675.
1.
1可适应语言的头文件675.
1.
2幂等头文件685.
2模板定义695.
2.
1包括的模板定义695.
2.
2独立的模板定义696创建和使用模板716.
1函数模板716.
1.
1函数模板声明716.
1.
2函数模板定义71目录56.
1.
3函数模板用法726.
2类模板726.
2.
1类模板声明726.
2.
2类模板定义726.
2.
3类模板成员定义736.
2.
4类模板的用法746.
3模板实例化746.
3.
1隐式模板实例化746.
3.
2显式模板实例化746.
4模板组合756.
5缺省模板参数766.
6模板专门化766.
6.
1模板专门化声明766.
6.
2模板专门化定义766.
6.
3模板专门化使用和实例化776.
6.
4部分专门化776.
7模板问题部分786.
7.
1非本地名称解析和实例化786.
7.
2作为模板参数的本地类型786.
7.
3模板函数的友元声明796.
7.
4在模板定义内使用限定名称816.
7.
5嵌套模板名称816.
7.
6引用静态变量和静态函数816.
7.
7在同一目录中使用模板生成多个程序827编译模板857.
1详细编译857.
2系统信息库管理857.
2.
1生成的实例857.
2.
2整个类实例化857.
2.
3编译时实例化867.
2.
4模板实例的放置和链接867.
3外部实例877.
3.
1可能的高速缓存冲突877.
3.
2静态实例88目录OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0167.
3.
3全局实例887.
3.
4显式实例887.
3.
5半显式实例897.
4模板系统信息库897.
4.
1系统信息库结构897.
4.
2写入模板系统信息库897.
4.
3从多模板系统信息库读取907.
4.
4共享模板系统信息库907.
4.
5通过-instances=extern实现模板实例自动一致907.
5模板定义搜索907.
5.
1源文件位置约定917.
5.
2定义搜索路径917.
5.
3诊断有问题的搜索918异常处理938.
1同步和异步异常938.
2指定运行时错误938.
3禁用异常948.
4使用运行时函数和预定义的异常948.
5将异常与信号和Setjmp/Longjmp混合使用958.
6生成具有异常的共享库959改善程序性能979.
1避免临时对象979.
2使用内联函数979.
3使用缺省运算符989.
4使用值类999.
4.
1选择直接传递类999.
4.
2在不同的处理器上直接传递类999.
5缓存成员变量10010生成多线程程序10110.
1生成多线程程序10110.
1.
1表明多线程编译101目录710.
1.
2与线程和信号一起使用C++支持库10210.
2在多线程程序中使用异常10210.
2.
1线程取消10210.
3在线程之间共享C++标准库对象10210.
4内存边界内部函数104第3部分库10711使用库10911.
1C库10911.
2随C++编译器提供的库10911.
2.
1C++库描述11011.
2.
2访问C++库的手册页11111.
2.
3缺省C++库11111.
3相关的库选项11111.
4使用类库11311.
4.
1iostream库11311.
4.
2链接C++库11411.
5静态链接标准库11411.
6使用共享库11511.
7替换C++标准库11611.
7.
1可以替换的内容11611.
7.
2不可替换的内容11611.
7.
3安装替换库11711.
7.
4使用替换库11711.
7.
5标准头文件实现11712使用C++标准库12112.
1C++标准库头文件12212.
2STLport12312.
2.
1重新分发和支持的STLport库12412.
3Apachestdcxx标准库124目录OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01813使用传统iostream库12713.
1预定义的iostream12713.
2iostream交互的基本结构12813.
3使用传统iostream库12813.
3.
1使用iostream进行输出12913.
3.
2使用iostream进行输入13113.
3.
3定义自己的提取运算符13213.
3.
4使用char*提取器13213.
3.
5读取任何单一字符13313.
3.
6二进制输入13313.
3.
7查看输入13313.
3.
8提取空白13313.
3.
9处理输入错误13413.
3.
10结合使用iostream与stdio13413.
4创建iostream13513.
4.
1使用类fstream处理文件13513.
5iostream赋值13713.
6格式控制13813.
7操纵符13813.
7.
1使用无格式操纵符13913.
7.
2参数化操纵符14013.
8strstream:用于数组的iostream14113.
9stdiobuf:用于stdio文件的iostream14113.
10处理streambuf流14113.
10.
1streambuf指针类型14213.
10.
2使用streambuf对象14213.
11iostream手册页14313.
12iostream术语14414生成库14714.
1了解库14714.
2生成静态(归档)库14814.
3生成动态(共享)库14814.
4生成包含异常的共享库14914.
5生成专用的库149目录914.
6生成公用的库15014.
7生成具有CAPI的库15014.
8使用dlopen从C程序访问C++库151第4部分附录153AC++编译器选项155A.
1选项信息的结构155A.
2选项参考156A.
2.
1156A.
2.
2156A.
2.
3–Bbinding156A.
2.
4–c158A.
2.
5–cg{89|92}158A.
2.
6–compat={5|g}158A.
2.
7+d159A.
2.
8-Dname[=def]160A.
2.
9–d{y|n}161A.
2.
10–dalign161A.
2.
11–dryrun162A.
2.
12–E162A.
2.
13-erroff[=t]163A.
2.
14-errtags[=a]164A.
2.
15-errwarn[=t]164A.
2.
16–fast165A.
2.
17–features=a[,a.
167A.
2.
18-filt[=filter[,filter.
170A.
2.
19–flags172A.
2.
20-fma[={none|fused}172A.
2.
21–fnonstd172A.
2.
22–fns[={yes|no}172A.
2.
23–fprecision=p174A.
2.
24–fround=r174A.
2.
25–fsimple[=n]175A.
2.
26–fstore176目录OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0110A.
2.
27-ftrap=t[,t.
177A.
2.
28–G178A.
2.
29–g179A.
2.
30–g0180A.
2.
31-g3180A.
2.
32–H180A.
2.
33–h[]name180A.
2.
34–help181A.
2.
35-Ipathname181A.
2.
36-I-182A.
2.
37–i184A.
2.
38-includefilename184A.
2.
39-inline185A.
2.
40–instances=a185A.
2.
41–instlib=filename186A.
2.
42–KPIC187A.
2.
43–Kpic187A.
2.
44–keeptmp187A.
2.
45–L路径187A.
2.
46–llib188A.
2.
47–libmieee188A.
2.
48–libmil188A.
2.
49-library=l[,l.
188A.
2.
50-m32|-m64191A.
2.
51-mc192A.
2.
52–misalign192A.
2.
53-mr[,string]192A.
2.
54-mt[={yes|no}192A.
2.
55–native193A.
2.
56–noex193A.
2.
57–nofstore193A.
2.
58–nolib193A.
2.
59–nolibmil194A.
2.
60–norunpath194A.
2.
61–O194A.
2.
62–Olevel194目录11A.
2.
63–ofilename194A.
2.
64+p195A.
2.
65–P195A.
2.
66–p196A.
2.
67–pentium196A.
2.
68–pg196A.
2.
69-PIC196A.
2.
70–pic196A.
2.
71–pta196A.
2.
72–ptipath196A.
2.
73–pto197A.
2.
74–ptv197A.
2.
75–Qoptionphaseoption[,option…197A.
2.
76–qoptionphaseoption198A.
2.
77–qp198A.
2.
78–Qproducesourcetype198A.
2.
79–qproducesourcetype199A.
2.
80–Rpathname[:pathname…199A.
2.
81–S199A.
2.
82–s199A.
2.
83-staticlib=l[,l…199A.
2.
84-sync_stdio=[yes|no]201A.
2.
85–temp=path202A.
2.
86–template=opt[,opt…202A.
2.
87–time203A.
2.
88-traceback[={%none|common|signals_list}203A.
2.
89–Uname204A.
2.
90–unroll=n205A.
2.
91–V205A.
2.
92–v205A.
2.
93–verbose=v[,v…205A.
2.
94-Wc,arg206A.
2.
95+w207A.
2.
96+w2207A.
2.
97–w207A.
2.
98-Xlinkerarg208目录OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0112A.
2.
99–Xm208A.
2.
100-xaddr32208A.
2.
101-xalias_level[=n]208A.
2.
102-xanalyze={code|no}210A.
2.
103-xannotate[=yes|no]211A.
2.
104–xar211A.
2.
105–xarch=isa212A.
2.
106-xautopar215A.
2.
107-xbinopt={prepare|off}215A.
2.
108-xbuiltin[={%all|%default|%none}216A.
2.
109–xcache=c217A.
2.
110-xchar[=o]218A.
2.
111-xcheck[=i]220A.
2.
112-xchip=c220A.
2.
113–xcode=a222A.
2.
114-xdebugformat=[stabs|dwarf]224A.
2.
115-xdepend=[yes|no]225A.
2.
116-xdumpmacros[=value[,value.
225A.
2.
117-xe228A.
2.
118-xF[=v[,v.
228A.
2.
119-xhelp=flags229A.
2.
120-xhwcprof230A.
2.
121-xia230A.
2.
122-xinline[=func-spec[,func-spec.
231A.
2.
123-xinstrument=[no%]datarace232A.
2.
124-xipo[={0|1|2}233A.
2.
125-xipo_archive=[a]235A.
2.
126-xivdep[=p]236A.
2.
127-xjobs=n237A.
2.
128-xkeepframe[=[%all,%none,name,no%name]237A.
2.
129-xlang=language[,language]238A.
2.
130-xldscope={v}239A.
2.
131-xlibmieee240A.
2.
132-xlibmil240A.
2.
133–xlibmopt241A.
2.
134–xlic_lib=sunperf241目录13A.
2.
135–xlicinfo241A.
2.
136-xlinkopt[=level]241A.
2.
137-xloopinfo242A.
2.
138–xM243A.
2.
139-xM1243A.
2.
140-xMD244A.
2.
141-xMF244A.
2.
142-xMMD244A.
2.
143–xMerge244A.
2.
144-xmaxopt[=v]244A.
2.
145-xmemalign=ab245A.
2.
146-xmodel=[a]246A.
2.
147–xnolib247A.
2.
148–xnolibmil248A.
2.
149–xnolibmopt248A.
2.
150-xnorunpath249A.
2.
151-xOlevel249A.
2.
152-xopenmp[=i]251A.
2.
153-xpagesize=n253A.
2.
154-xpagesize_heap=n254A.
2.
155-xpagesize_stack=n254A.
2.
156-xpch=v255A.
2.
157-xpchstop=file257A.
2.
158-xpec[={yes|no}258A.
2.
159–xpg258A.
2.
160-xport64[=(v259A.
2.
161-xprefetch[=a[,a.
261A.
2.
162-xprefetch_auto_type=a263A.
2.
163-xprefetch_level[=i]264A.
2.
164–xprofile=p264A.
2.
165-xprofile_ircache[=path]267A.
2.
166-xprofile_pathmap267A.
2.
167-xreduction268A.
2.
168–xregs=r[,r.
268A.
2.
169-xrestrict[=f]270A.
2.
170–xs271目录OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0114A.
2.
171–xsafe=mem272A.
2.
172–xspace272A.
2.
173–xtarget=t272A.
2.
174-xthreadvar[=o]276A.
2.
175–xtime276A.
2.
176-xtrigraphs[={yes|no}277A.
2.
177–xunroll=n278A.
2.
178-xustr={ascii_utf16_ushort|no}278A.
2.
179-xvector[=a]279A.
2.
180-xvis[={yes|no}280A.
2.
181-xvpara280A.
2.
182–xwe280A.
2.
183-Yc,path280A.
2.
184-z[]arg282BPragma283B.
1Pragma形式283B.
1.
1将函数作为pragma参数进行重载283B.
2Pragma参考284B.
2.
1#pragmaalign284B.
2.
2#pragmadoes_not_read_global_data285B.
2.
3#pragmadoes_not_return285B.
2.
4#pragmadoes_not_write_global_data285B.
2.
5#pragmadumpmacros286B.
2.
6#pragmaend_dumpmacros287B.
2.
7#pragmaerror_messages287B.
2.
8#pragmafini287B.
2.
9#pragmahdrstop288B.
2.
10#pragmaident288B.
2.
11#pragmainit288B.
2.
12#pragmaivdep289B.
2.
13#pragmamust_have_frame289B.
2.
14#pragmano_side_effect289B.
2.
15#pragmaopt290B.
2.
16#pragmapack(n)290目录15B.
2.
17#pragmararely_called291B.
2.
18#pragmareturns_new_memory292B.
2.
19#pragmaunknown_control_flow292B.
2.
20#pragmaweak292词汇表295索引301目录OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0116示例示例6–1本地类型用作模板参数问题的示例78示例6–2友元声明问题的示例79示例13–1string提取运算符132示例A–1预处理程序示例foo.
cc162示例A–2使用-E选项时foo.
cc的预处理程序输出1621718前言本指南介绍了OracleSolarisStudio12.
3C++编译器.
受支持的平台此OracleSolarisStudio发行版支持使用以下体系结构的平台:运行OracleSolaris操作系统的SPARC系列的处理器体系结构,以及运行OracleSolaris或特定Linux系统的x86系列处理器体系结构.
本文档使用以下术语说明x86平台之间的区别:"x86"泛指64位和32位的x86兼容产品系列.
"x64"表示特定的64位x86兼容CPU.
"32位x86"指出了有关基于x86的系统的特定32位信息.
在SPARC和x86系统中,特定于Linux系统的信息仅指受支持的Linuxx86平台,而特定于OracleSolaris系统的信息仅指受支持的OracleSolaris平台.
有关受支持的硬件平台和操作系统发行版的完整列表,请参见《OracleSolarisStudio12.
3发行说明》.
OracleSolarisStudio文档可以查找OracleSolarisStudio软件的完整文档,如下所述:产品文档位于OracleSolarisStudio文档Web站点,包括发行版说明、参考手册、用户指南和教程.
代码分析器、性能分析器、线程分析器、dbxtool、DLight和IDE的联机帮助可以在这些工具中通过"Help"(帮助)菜单以及F1键和许多窗口和对话框上的"Help"(帮助)按钮获取.
命令行工具的手册页介绍了工具的命令选项.
19相关的第三方Web站点引用本文档引用了第三方URL,以用于提供其他相关信息.
注–Oracle对本文档中提到的第三方Web站点的可用性不承担任何责任.
对于此类站点或资源中的(或通过它们获得的)任何内容、广告、产品或其他资料,Oracle并不表示认可,也不承担任何责任.
对于因使用或依靠此类站点或资源中的(或通过它们获得的)任何内容、产品或服务而造成的或连带产生的实际或名义损坏或损失,Oracle概不负责,也不承担任何责任.
开发者资源对于使用OracleSolarisStudio的开发者,可访问Oracle技术网Web站点来查找以下资源:有关编程技术和最佳做法的文章软件最新发行版完整文档的链接有关支持级别的信息用户讨论论坛.
获取Oracle支持Oracle客户可通过MyOracleSupport获取电子支持.
有关信息,请访问http://www.
oracle.
com/pls/topic/lookupctx=acc&id=info,或访问http://www.
oracle.
com/pls/topic/lookupctx=acc&id=trs(如果您听力受损).
印刷约定下表介绍了本书中的印刷约定.
表P–1印刷约定字体或符号含义示例AaBbCc123命令、文件和目录的名称;计算机屏幕输出编辑.
login文件.
使用ls-a列出所有文件.
machine_name%youhavemail.
AaBbCc123用户键入的内容,与计算机屏幕输出的显示不同machine_name%suPassword:前言OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0120表P–1印刷约定(续)字体或符号含义示例aabbcc123要使用实名或值替换的命令行占位符删除文件的命令为rmfilename.
AaBbCc123保留未译的新词或术语以及要强调的词这些称为Class选项.
注意:有些强调的项目在联机时以粗体显示.
新词术语强调新词或术语以及要强调的词高速缓存是存储在本地的副本.
请勿保存文件.
《书名》书名阅读《用户指南》的第6章.
命令中的shell提示符示例下表显示了OracleSolarisOS中包含的缺省UNIXshell系统提示符和超级用户提示符.
请注意,在命令示例中显示的缺省系统提示符可能会有所不同,具体取决于OracleSolaris发行版.
表P–2shell提示符shell提示符Bashshell、Kornshell和Bourneshell$Bashshell、Kornshell和Bourneshell超级用户#Cshellmachine_name%Cshell超级用户machine_name#前言2122C++编译器第1部分2324C++编译器本章提供了有关最新OracleSolarisStudioC++编译器的一般信息.
1.
1OracleSolarisStudio12.
3C++5.
12编译器的新特性和新功能本节提供了一个汇总列表,介绍了OracleSolarisStudio12.
3C++5.
12编译器发行版中的新增特性和功能以及已修改的特性和功能.
支持新SPARCT4平台:—xtarget=T4,—xchip=T4,—xarch=sparc4支持新x86平台SandyBridge/AVX:—xtarget=sandybridge—xchip=sandybridge—xarch=avx支持新x86平台Westmere/AES:—xtarget=westmere—xchip=westmere—xarch=aes新编译器选项—g3添加了扩展的调试符号表信息.
(第180页中的"A.
2.
31-g3")新编译器选项:—Xlinkerarg将参数传递给链接程序ld(1).
等效于—Wl,arg.
(第208页中的"A.
2.
98-Xlinkerarg")OpenMP缺省线程数OMP_NUM_THREADS现在为2(以前是1).
(第251页中的"A.
2.
152-xopenmp[=i]")支持OpenMP3.
1共享内存并行化规范.
(第251页中的"A.
2.
152-xopenmp[=i]")新编译器选项—xivdep设置ivdeppragma的解释.
ivdeppragma指示编译器忽略在循环中找到的部分或全部对数组引用的循环附带依赖性,以进行优化.
这使得编译器可以执行各种循环优化,如微向量化、分发、软件流水操作等,其他情况下,无法执行这些优化.
当用户知道这些相关项无关紧要或者实际上永远不会发生时,可以使用该指令.
(第236页中的"A.
2.
126-xivdep[=p]")使用—library=sunperf可链接到Sun性能库.
这淘汰了-xlic_lib=sunperf.
(第188页中的"A.
2.
49-library=l[,l.
.
.
]")1第1章25—compat=4子选项("兼容模式")被删除.
缺省设置现在为—compat=5.
此外,针对g++源和二进制兼容性的-compat=g选项先前仅适用于Linux平台,现在已扩展到OracleSolaris/x86.
(第158页中的"A.
2.
6–compat={5|g}")新选项—features=cplusplus_redef允许在命令行中通过—D选项重新定义以常规方式预定义的宏__cplusplus.
现在仍不允许在源代码中通过#define指令重新定义__cplusplus.
此外,—features=%none和—features=%all用法在此发行版中现已过时.
(第167页中的"A.
2.
17–features=a[,a.
.
.
]")新选项—xanalyze={code|no}生成对源代码的静态分析,可使用OracleSolaris代码分析器进行查看.
(第210页中的"A.
2.
102-xanalyze={code|no}")新子选项—xbuiltin=%default仅内联未设置errno的函数.
errno的值在任何优化级别始终保持正确,并且可以可靠地对其进行检查.
(第216页中的"A.
2.
108-xbuiltin[={%all|%default|%none}]")支持用户提供的编译器选项缺省值.
(第52页中的"3.
4用户提供的缺省选项文件")C99头文件stdbool.
h和C++等效项cstdbool现在可用.
在C++中,头文件不起任何作用,提供它们只是为了与C99兼容.
1.
2x86特殊注意事项针对x86OracleSolaris平台进行编译时,请注意几个重要问题.
xarch设置为-sse、sse2、sse2a、sse3或更高时编译的程序只能在提供这些扩展和功能的平台上运行.
在x86上得到的数值结果可能与在SPARC上得到的结果不同,这是由x8680位浮点寄存器造成的.
为了最大限度减少这些差异,请使用-fstore选项或使用-xarch=sse2进行编译(如果硬件支持SSE2).
因为内部数学库(例如,sin(x))不同,所以OracleSolaris和Linux之间的数值结果也会不同.
1.
3针对64位平台进行编译使用-m32选项针对ILP3232位模型进行编译.
使用-m64选项针对LP6464位模型进行编译.
ILP32模型指定C++语言的int、long和pointer数据类型的宽度均为32位.
LP64模型指定long和pointer数据类型均为64位.
OracleSolarisOS和LinuxOS还支持LP64内存模型下的大型文件和大型数组.
如果使用-m64进行编译,则生成的可执行文件仅能在运行64位内核的OracleSolarisOS或LinuxOS下的64位UltraSPARC或x86处理器上运行.
64位对象的编译、链接和执行只能在支持64位执行的OracleSolarisOS或LinuxOS上进行.
1.
2x86特殊注意事项OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01261.
4二进制兼容验证在OracleSolaris系统上,以OracleSolarisStudio编译器编译的程序二进制文件都标记了体系结构硬件标志(指示编译的二进制文件所采用的指令集).
运行时,会检查这些标记标志以验证该二进制文件是否可以在它尝试在上面执行的硬件上运行.

如果程序不包含这些体系结构硬件标志,或者如果平台没有启用适当的功能或指令集扩展,则运行此程序可能会导致段故障或错误结果,且不会显示任何显式警告消息.

此警告还会扩展到采用.
il内联汇编语言函数或__asm()汇编程序代码(使用SSE、SSE2、SSE2a和SSE3以及更新指令和扩展)的程序.
1.
5标准符合性C++编译器(CC)支持C++ISO国际标准ISOIS14882:2003编程语言-C++.
在SPARC平台上,编译器提供了对SPARCV8和SPARCV9(包括UltraSPARC实现)优化开发功能的支持.
在Prentice-HallforSPARCInternational发行的第8版(ISBN0-13-825001-4)和第9版(ISBN0-13-099227-5)SPARCArchitectureManual中定义了这些功能.
在本文档中,"标准"是指与上面列出的标准版本相一致.
"非标准"或"扩展"是指这些标准的这些版本之外的功能.
负责标准的一方可能会不时地修订这些标准.
C++编译器兼容的适用标准版本可能被修订或替换,这将会导致以后的OracleSolarisStudioC++编译器发行版本在功能上与旧的发行版本产生不兼容.
1.
6发行版信息《OracleSolarisStudio12.
3的新增功能》指南重点介绍了与该编译器发行版相关的重要信息并包括:在手册印刷之后发现的信息新特性和更改的特性软件更正问题和解决办法限制和不兼容可发送库未实现的标准此发行版的文档索引页上提供了新增功能指南,网址为:http://www.
oracle.
com/technetwork/server-storage/solarisstudio/documentation1.
6发行版信息第1章C++编译器271.
7手册页联机手册(man)页提供了关于命令、函数、子例程以及收集这些信息的文档.
可以通过运行以下命令来显示手册页:example%mantopic在整个C++文档中,手册页参考都以主题名称和手册节编号表示:通过manCC访问CC(1).
在man命令中使用-s选项可以访问除第1节之外的各节(例如,ieee_flags(3M)),如下所示:example%man-s3Mieee_flags1.
8本地语言支持此发行版本的C++支持使用英语以外的其他语言进行应用程序的开发,包括大多数欧洲语言、中文和日语.
因此,您可以十分便捷地将应用程序从一种语言切换到另一种语言.
此功能被称为国际化.
通常,C++编译器按如下方式实现国际化:C++从国际化的键盘识别ASCII字符(也就是说,它具有键盘独立性和8位清除).
C++允许使用本地语言打印某些消息.
C++允许在注释、字符串和数据中使用本地语言.
C++只支持符合扩展UNIX字符(ExtendedUNIXCharacte,EUC)的字符集,在该字符集中,字符串内每个空字节是一个空字符,而字符串内每个ASCII值为/的字节是一个/字符.
变量名称不能国际化,必须使用英文字符集.
您可以设置语言环境将应用程序从一种本地语言更改为另一种语言.
关于这一点和其他本地语言支持功能的信息,请参见操作系统文档.
1.
7手册页OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0128使用C++编译器本章介绍了如何使用C++编译器.
任何编译器的主要用途是将高级语言(如C++)编写的程序转换成目标计算机硬件可执行的数据文件.
可以使用C++编译器执行以下操作:将源文件转换成可重定位的二进制(.
o)文件,以后链接到可执行文件、静态(归档)库(.
a)文件(使用-xar)或动态(共享)库(.
so)文件将目标文件或库文件(或两者)链接或重链接成可执行文件在运行时调试处于启用状态的情况下编译可执行文件(-g)使用运行时语句或过程级分析(-pg)编译可执行文件2.
1入门本节简要概述了如何使用C++编译器编译和运行C++程序.
有关命令行选项的完整参考,请参见附录A,C++编译器选项.
注–本章中的命令行示例说明了CC的用法.
打印输出可能会稍有不同.
生成和运行C++程序的基本步骤包括以下任务:1.
使用编辑器创建C++源文件(后缀为表2–1中所列有效后缀之一)2.
调用编译器来生成可执行文件3.
通过输入可执行文件的名称来启动程序以下程序在屏幕上显示消息:example%catgreetings.
cc#includeintmain(){2第2章29std::couty,"xis%dbutyis%d",x,y);其结果如下:fprintf(stderr,"Flag");fprintf(stderr,"X=%d\n",x);puts("Thefirst,second,andthirditems.
");((x>y)puts("x>y"):printf("xis%dbutyis%d",x,y));2.
5.
3预定义的名称附录中的第160页中的"A.
2.
8-Dname[=def]"介绍了预定义的宏.
可以在#ifdef这样的预处理程序条件中使用这些值.
+p选项可防止自动定义sun、unix、sparc和i386预定义宏.
2.
5.
4警告和错误#error和#warning预处理程序指令可用来生成编译时诊断.
#errortoken-string发送错误诊断token-string并终止编译操作#warningtoken-string发送警告诊断token-string并继续执行编译操作.
2.
6内存要求编译需要的内存量取决于多个参数,包括:每个过程的大小优化级别为虚拟内存设置的限制磁盘交换文件的大小2.
6内存要求OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0136在SPARC平台上,如果优化器用完了所有内存,那么它将通过在较低优化级别上重试当前过程来尝试恢复.
然后优化器将以在命令行上通过-xOlevel选项指定的原始级别恢复后续例程.
如果编译包括大量例程的单独源文件,编译器可能会用完所有内存或交换空间.
可以尝试降低优化级别.
或者,将最大的过程分为其自身的单独文件.
2.
6.
1交换空间大小swap-s命令用于显示可用的交换空间.
有关更多信息,请参见swap(1M)手册页.
以下示例演示了swap命令的用法:example%swap-stotal:40236kbytesallocated+7280kreserved=47516kused,1058708kavailable2.
6.
2增加交换空间使用mkfile(1M)和swap(1M)可增加工作站上交换空间的大小.
(您必须成为超级用户才能执行该操作).
mkfile用于命令创建特定大小的文件,而swap-a用于将文件增加到系统交换空间:example#mkfile-v90m/home/swapfile/home/swapfile94317840bytesexample#/usr/sbin/swap-a/home/swapfile2.
6.
3虚拟内存的控制在-xO3或更高级别编译非常大型的例程(一个过程中有数几千行代码)需要大量内存.
在这种情况下,系统性能可能降低.
您可以通过限制单个进程的可用虚拟内存量来控制内存占用.
要在shshell中限制虚拟内存,请使用ulimit命令.
有关更多信息,请参见sh(1)手册页.
以下示例显示了如何将虚拟内存限制为4GB:example$ulimit-d4000000在cshshell中,可使用limit命令限制虚拟内存.
有关更多信息,请参见csh(1)手册页.
下一个示例也显示了如何将虚拟内存限制为4GB:2.
6内存要求第2章使用C++编译器37example%limitdatasize4G这些示例都会使优化器在数据空间达到4GB时尝试恢复.
虚拟空间的限制不能大于系统总的可用交换空间.
在实际使用时,虚拟空间的限制要足够的小,以允许在大型编译过程中正常使用系统.
请确保编译不会消耗一半以上的交换空间.
有8GB的交换空间时,请使用以下命令:在shshell中:example$ulimit-d4000000在cshshell中:example%limitdatasize4G最佳设置取决于要求的优化程度、实际内存量和可用的虚拟内存量.
2.
6.
4内存要求工作站至少应有2GB内存.
有关详细要求,请参见产品发行说明.
2.
7将strip命令用于C++目标不应将UNIXstrip命令用于C++目标文件,因为这会导致这些目标文件不可用.
2.
8简化命令可以通过定义特殊的shell别名、使用CCFLAGS环境变量或使用make来简化复杂的编译器命令.
2.
8.
1在CShell中使用别名以下示例为带有常用选项的命令定义了别名.
example%aliasCCfx"CC-fast-xnolibmil"以下示例使用了别名CCfx.
2.
7将strip命令用于C++目标OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0138example%CCfxany.
C现在命令CCfx与以下命令等效:example%CC-fast-xnolibmilany.
C2.
8.
2使用CCFLAGS指定编译选项可以通过设置CCFLAGS变量来指定选项.
可以在命令行中显式使用CCFLAGS变量.
以下示例说明了如何设置CCFLAGS(CShell):example%setenvCCFLAGS'-xO2-m64'以下示例显式使用了CCFLAGS.
example%CC$CCFLAGSany.
cc使用make时,如果像上述示例那样设置CCFLAGS变量,且makefile的编译规则是隐式的,那么调用make时生成的编译等效于以下命令:CC-xO2-m64files.
.
.
2.
8.
3使用makemake实用程序是功能非常强大的程序开发工具,可以方便地与所有OracleSolarisStudio编译器一起使用.
有关更多信息,请参见make(1S)手册页.
2.
8.
3.
1在make中使用CCFLAGS使用makefile的隐式编译规则(即没有C++编译行)时,make程序会自动使用CCFLAGS.
2.
8简化命令第2章使用C++编译器3940使用C++编译器选项本章解释了如何使用命令行C++编译器选项,并按功能汇总它们的使用.
第156页中的"A.
2选项参考"中对这些选项进行了详细说明.
3.
1语法概述下表显示了本书中使用的典型选项语法格式的示例.
表3–1选项语法格式示例语法格式示例-option–E–optionvalue–Ipathname–option=value–xunroll=4–optionvalue–ofilename圆括号、大括号、方括号、"|"或"-"字符以及省略号是选项描述中使用的元字符,而不是选项自身的一部分.
有关用法语法的详细说明,请参见本手册前言中的印刷约定.

3.
2通用指南C++编译器选项的某些通用指南:-llib选项用于与库liblib.
a(或liblib.
so)链接.
较稳妥的方式是总是将-llib放在源文件和对象文件后面,这样可以确保库搜索顺序.
通常,编译器选项的处理顺序是从左到右(但-U选项在所有-D选项之后处理这种情况除外),从而可以有选择地覆盖宏选项(包括其他选项的选项).
此规则不适用于链接程序选项.
3第3章41-features、-I-l、-L、-library、-pti、-R、-staticlib、-U、-verbose和-xprefetch选项都会累积,但它们不会覆盖.
-D选项会累积,但相同名称的多个-D选项会互相覆盖.
源文件、目标文件和库是按其在命令行上的出现顺序编译和链接.
3.
3按功能汇总的选项在本节中,编译器选项按功能分组以便提供快速参考.
有关各个选项的详细说明,请参阅附录A,C++编译器选项.
这些选项适用于除了特别注明之外的所有平台;基于SPARC的系统上的OracleSolarisOS特有的功能标识为SPARC,基于x86的系统上的OracleSolarisOS特有的功能标识为x86.
3.
3.
1代码生成选项表3–2代码生成选项选项操作-compat设置编译器的主发行版本兼容模式.
-g编译以便用于调试器.
-KPIC生成与位置无关的代码.
-Kpic生成与位置无关的代码.
-mt编译和链接多线程代码.
-xaddr32将代码限定于32位地址空间(x86/x64)-xarch指定目标体系结构.
-xcode=a(SPARC)指定代码地址空间.
-xlinker指定链接程序选项.
-xMerge(SPARC)将数据段和文本段合并.
-xtarget指定目标系统.
-xmodel针对Solarisx86平台修改64位对象形式+w标识可能产生不可预料结果的代码.
+w2发出由+w发出的所有警告以及关于技术违规的警告,这些技术违规可能是无害的,但可能会降低程序的最大可移植性.
3.
3按功能汇总的选项OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0142表3–2代码生成选项(续)选项操作-xregs如果编译器可以使用更多的寄存器用于临时存储(临时寄存器),那么编译器将能生成速度更快的代码.
该选项使得附加临时寄存器可用,而这些附加寄存器通常是不适用的.
-zarg链接程序选项.
3.
3.
2编译时性能选项表3–3编译时性能选项选项操作-instlib禁止生成已出现在指定库中的模板实例.
-m32|-m64指定编译的二进制对象的内存模型.
-xinstrument编译并检测程序,以供线程分析器进行分析.
-xjobs设置编译器可以为完成工作而创建的进程数量.
-xpch可以减少应用程序的编译时间,这些应用程序的源文件共享一组通用的include文件.
-xpchstop指定在使用-xpch选项创建预编译头文件时要考虑的最后一个include文件.
-xprofile_ircache(SPARC)重新使用在执行-xprofile=collect期间保存的编译数据.
-xprofile_pathmap(SPARC)支持单个分析目录中有多个程序或共享库.
3.
3.
3编译时选项和链接时选项下表列出了在链接时和编译时均必须指定的选项.
表3–4编译时选项和链接时选项选项操作-fast选择用于控制可执行代码速度的编译选项的最优组合.
-m32|-m64指定编译的二进制对象的内存模型.
-mt扩展为-D_REENTRANT-lthread的宏选项.
-xarch指定指令集体系结构.
3.
3按功能汇总的选项第3章使用C++编译器选项43表3–4编译时选项和链接时选项(续)选项操作-xautopar为多个处理器启用自动并行化.
-xhwcprof(SPARC)为基于硬件计数器的分析启用编译器支持.
-xipo通过调用过程间分析组件来执行整个程序优化.
-xlinker指定链接程序选项.
-xlinkopt对可重定位目标文件执行链接时优化.
-xmemalign(SPARC)指定假定的最大内存对齐以及未对齐的数据访问的行为.
-xopenmp支持用于显式并行化的OpenMP接口,包括一组源代码指令、运行时库例程和环境变量.
-xpagesize设置堆栈和堆的首选页面大小.
-xpagesize_heap设置堆的首选页面大小.
-xpagesize_stack设置堆栈的首选页面大小.
-xpg准备目标代码来收集数据以使用gprof(1)进行分析.
-xprofile收集用于分析的数据或使用分析进行优化.
-xvector=lib启用对向量库函数调用的自动生成.
3.
3.
4调试选项表3–5调试选项选项操作-###等效于-dryrun.
+d不扩展C++内联函数.
-dryrun显示驱动程序将向编译的所有组件发出的所有命令.
-E仅对C++源文件运行预处理程序,并将结果发送到stdout.
不编译.
-g编译以便用于调试器.
-g0编译以便进行调试,但不禁用内联.
-H打印包含文件的路径名称.
-keeptmp保留编译时创建的临时文件.
3.
3按功能汇总的选项OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0144表3–5调试选项(续)选项操作-P仅预处理源文件,输出到.
i文件.
-Qoption直接将选项传递到编译阶段.
-s从可执行文件中去掉符号表,这样可以保护调试代码的能力.
-temp=dir为临时文件定义目录.
-verbose=vlst控制编译器详细内容.
-xcheck对堆栈溢出增加一个运行时检查.
-xdumpmacros打印诸如定义、定义及未定义的位置和已使用的位置的宏信息.
-xe仅检查语法和语义错误.
-xhelp=flags显示编译器选项汇总列表.
-xport64对32位体系结构到64位体系结构的移植过程中的常见问题发出警告.
3.
3.
5浮点选项表3–6浮点选项选项操作-fma(SPARC)启用自动生成浮点乘加指令.
-fns[={no|yes}](SPARC)禁用或启用SPARC非标准浮点模式.
-fprecision=px86:设置浮点精度模式.
-fround=r设置启动时生效的IEEE舍入模式.
-fsimple=n设置浮点优化首选项.
-fstorex86:强制浮点表达式的精度.
-ftrap=tlst设置启动时生效的IEEE陷阱操作模式.
-nofstorex86:禁用表达式的强制精度.
-xlibmieee使libm在异常情况下对于数学例程返回IEEE754值.
3.
3按功能汇总的选项第3章使用C++编译器选项453.
3.
6语言选项表3–7语言选项选项操作-compat设置编译器的主发行版本兼容模式.
-features=alst启用或禁用各种C++语言特性.
-xchar在char类型定义为无符号的系统上,简化代码的移植.
-xldscope控制变量和函数定义的缺省链接程序范围,以创建更快更安全的共享库.
-xthreadvar(SPARC)更改缺省的线程局部存储访问模式.
-xtrigraphs启用三字母序列的识别.
-xustr启用识别由16位字符构成的文本字符串.
3.
3.
7库选项表3–8库选项选项操作-Bbinding请求符号、动态或静态库链接.
-d{y|n}允许或不允许整个可执行文件的动态库.
-G生成动态共享库来取代可执行文件.
-hname为生成的动态共享库指定内部名称.
-i通知ld(1)忽略任何LD_LIBRARY_PATH设置.
-Ldir将dir添加到要在其中搜索库的目录列表.
-llib将liblib.
a或liblib.
so添加到链接程序的库搜索列表.
-library=llst强制将特定库和相关文件包含到编译和链接中.
-mt编译和链接多线程代码.
-norunpath不将库的路径生成到可执行文件中.
-Rplst将动态库搜索路径生成到可执行文件中.
-staticlib=llst说明哪些C++库是静态链接的.
-xar创建归档库.
3.
3按功能汇总的选项OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0146表3–8库选项(续)选项操作-xbuiltin[=opt]启用或禁用标准库调用的更多优化.
-xia(Solaris)链接合适的区间运算库并设置适当的浮点环境.
-xlang=l[,l]包含适当的运行库,并确保指定语言的正确运行时环境.
-xlibmieee使libm在异常情况下对于数学例程返回IEEE754值.
-xlibmil内联选定的libm库例程以进行优化.
-xlibmopt使用优化数学例程的库.
-xnolib禁止链接缺省系统库.
-xnolibmil在命令行上取消–xlibmil.
-xnolibmopt不使用数学例程库.
3.
3.
8已过时选项注–以下选项当前已过时(因此编译器不再接受它们)或者在以后的发行版中可能会被删除.
表3–9已过时选项选项操作-features=[%all|%none]过时的子选项%all和%none.
-library=%all过时的子选项,在以后的发行版本中可能会被删除.
-xlic_lib=sunperf使用—library=sunperf可链接到Sun性能库.
-xlicinfo已过时.
-xnativeconnect已废弃,没有替代选项.
-xprefetch=yes改用-xprefetch=auto,explicit.
-xprefetch=no改用-xprefetch=no%auto,no%explicit.
-xvector=yes改用-xvector=lib.
-xvector=no改用-xvector=none.
3.
3按功能汇总的选项第3章使用C++编译器选项473.
3.
9输出选项表3–10输出选项选项操作-c仅编译;生成目标(.
o)文件,但抑制链接.
-dryrun显示但不编译由驱动程序传递到编译器的所有命令行.
-E仅对C++源文件运行预处理程序,并将结果发送到stdout.
不编译.
-erroff禁止编译器警告消息.
-errtags显示每条警告消息的消息标记.
-errwarn如果发出指示的警告消息,编译器将以失败状态退出.
-filt禁止编译器应用到链接程序错误消息的过滤.
–G生成动态共享库来取代可执行文件.
–H输出被包含文件的路径名称.
–migration解释可以从早期编译器获得有关移植信息的位置.
–ofilename将输出文件或可执行文件的名称设置为filename.
–P仅预处理源文件,输出到.
i文件.
–Qproducesourcetype使CC驱动程序生成类型为sourcetype的输出.
–s从可执行文件去掉符号表.
–verbose=vlst控制编译器详细内容.
+w必要时打印附加警告.
+w2适当时仍输出更多警告.
–w抑制警告消息.
-xdumpmacros打印诸如定义、定义及未定义的位置和已使用的位置的宏信息.
-xe仅对源文件执行语法和语义检查,但不生成任何对象或可执行代码.
–xhelp=flags显示编译器选项汇总列表.
–xM输出makefile依赖性信息.
–xM1生成相关项信息,但排除/usr/include.
–xtime报告每个编译阶段的执行时间.
3.
3按功能汇总的选项OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0148表3–10输出选项(续)选项操作–xwe将所有的警告转换为错误.
-zarg链接程序选项.
3.
3.
10运行时性能选项表3–11运行时性能选项选项操作–fast选择编译选项的组合以优化某些程序的执行速度.
-fma(SPARC)启用自动生成浮点乘加指令.
-g指示编译器和链接程序准备程序以进行性能分析(以及调试).
-s从可执行文件去掉符号表.
-m32|-m64指定编译的二进制对象的内存模型.
-xalias_level启用编译器执行基于类型的别名分析和优化.
-xarch=isa指定目标体系结构指令集.
-xbinopt准备二进制文件以便以后进行优化、转换和分析.
-xbuiltin[=opt]启用或禁用标准库调用的更多优化.
-xcache=c(SPARC)定义优化器的目标高速缓存属性.
-xchip=c指定目标处理器芯片.
-xF启用函数和变量的链接程序重新排序.
-xinline=flst指定用户编写的哪些例程可以被优化器内联-xipo执行过程间优化.
-xlibmil内联选定的libm库例程以进行优化.
-xlibmopt使用优化数学例程的库.
-xlinkopt(SPARC)除了目标文件中的所有优化之外,对生成的可执行文件或动态库执行链接时优化.
-xmemalign=ab(SPARC)指定假定的最大内存对齐以及未对齐的数据访问的行为.
-xnolibmil在命令行上取消–xlibmil.
3.
3按功能汇总的选项第3章使用C++编译器选项49表3–11运行时性能选项(续)选项操作-xnolibmopt不使用数学例程库.
-xOlevel将优化级别指定为level.
-xpagesize设置堆栈和堆的首选页面大小.
-xpagesize_heap设置堆的首选页面大小.
-xpagesize_stack设置堆栈的首选页面大小.
-xprefetch[=lst]在支持预取的体系结构上启用预取指令.
-xprefetch_level控制-xprefetch=auto设置的自动插入预取指令的主动性.
-xprofile收集运行时分析数据或使用运行时分析数据进行优化.
-xregs=rlst控制临时寄存器的使用.
-xsafe=mem(SPARC)不允许有基于内存的陷阱.
-xspace(SPARC)不允许会增大代码大小的优化.
-xtarget=t指定目标指令集和优化系统.
-xthreadvar更改缺省的线程局部存储访问模式.
-xunroll=n启用在可能的场合下解开循环.
-xvis(SPARC)使编译器可以识别VIS指令集中定义的汇编语言模板.
3.
3.
11预处理程序选项表3–12预处理程序选项选项操作-Dname[=def]为预处理程序定义符号name.
-E仅对C++源文件运行预处理程序,并将结果发送到stdout.
不编译.
-H输出被包含文件的路径名称.
-P仅预处理源文件,输出到.
i文件.
-Uname删除预处理程序符号name的初始定义.
-xM输出makefile依赖性信息.
-xM1生成依赖性信息,但排除/usr/include.
3.
3按功能汇总的选项OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01503.
3.
12分析选项表3–13分析选项选项操作-p准备目标代码来收集数据以使用prof进行分析.
-xpg编译以便使用gprof分析器进行分析.
-xprofile收集运行时分析数据或使用运行时分析数据进行优化.
3.
3.
13参考选项表3–14参考选项选项操作-xhelp=flags显示编译器选项汇总列表.
3.
3.
14源文件选项表3–15源文件选项选项操作-H输出被包含文件的路径名称.
-Ipathname将pathname添加到include文件搜索路径.
-I-更改包含文件搜索规则-xM输出makefile依赖性信息.
-xM1生成依赖性信息,但排除/usr/include.
3.
3.
15模板选项表3–16模板选项选项操作-instances=a控制模板实例的放置和链接.
-template=wlst启用或禁用各种模板选项.
3.
3按功能汇总的选项第3章使用C++编译器选项513.
3.
16线程选项表3–17线程选项选项操作-mt编译和链接多线程代码.
-xsafe=mem(SPARC)不允许有基于内存的陷阱.
-xthreadvar(SPARC)更改缺省的线程局部存储访问模式.
3.
4用户提供的缺省选项文件通过缺省编译器选项文件,用户可以指定一组应用于所有编译的缺省选项,除非另行覆盖.
例如,该文件可以指定所有编译的缺省级别为—xO2,或自动包括文件setup.
il.
启动时,编译器会搜索缺省选项文件,并列出应对所有编译包含的缺省选项.
环境变量SPRO_DEFAULTS_PATH可指定要在其中搜索缺省文件的冒号分隔目录列表.
如果该环境变量未设置,则会使用一组标准缺省设置.
如果该环境变量已设置但为空,则不会使用任何缺省设置.
缺省文件名的格式必须是compiler.
defaults,其中compiler为以下值之一:cc、c89、c99、CC、ftn或lint.
例如,C++编译器的缺省值为CC.
defaults.
如果在SPRO_DEFAULTS_PATH列出的目录中找到编译器的缺省文件,编译器将读取该文件并在命令行上处理各选项之前先处理这些选项.
系统将使用找到的第一个缺省文件,并且会终止搜索.
系统管理员可以在Studio-install-path/prod/etc/config中创建系统范围的缺省文件.
如果设置了该环境变量,则不会读取已安装的缺省文件.
缺省文件的格式与命令行类似.
该文件的每一行都可以包含一个或多个由空格分隔的编译器选项.
Shell扩展(例如通配符和替换)将不会应用于缺省文件中的选项.
SPRO_DEFAULTS_PATH的值和完全扩展的命令行将显示在由选项和—dryrun生成的详细输出中.
用户在命令行上指定的选项通常会优先于从缺省文件读取的选项.
例如,如果缺省文件指定使用—xO4进行编译,而用户在命令行上指定—xO2,则会使用—xO2.
缺省选项文件中显示的某些选项将附加在命令行中指定的选项之后.
这些选项包括预处理程序选项—I、链接程序选项—B、—L、—R和—l以及所有文件参数(例如源文件、目标文件、归档和共享对象).
以下是如何使用用户提供的缺省编译器选项启动文件的示例.
3.
4用户提供的缺省选项文件OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0152demo%cat/project/defaults/CC.
defaults-I/project/src/hdrs—L/project/libs—llibproj—xvparademo%setenvSPRO_DEFAULTS_PATH/project/defaultsdemo%CC—c—I/local/hdrs—L/local/libs—lliblocaltst.
c此命令现在等效于:CC-fast—xvpara—c—I/local/hdrs—L/local/libs—lliblocaltst.
c\—I/project/src/hdrs—L/project/libs—llibproj尽管编译器缺省文件提供了可为整个项目设置缺省值的便利方法,但它也可能成为问题难以诊断的原因.
将环境变量SPRO_DEFAULTS_PATH设置为当前目录以外的绝对路径可避免出现此类问题.
缺省选项文件的接口稳定性未确定.
选项处理顺序在以后的发行版中可能会更改.

3.
4用户提供的缺省选项文件第3章使用C++编译器选项5354编写C++程序第2部分5556语言扩展本章介绍了与此编译器相关的语言扩展.
在命令行上指定某些编译器选项之后,编译器才能识别本章中描述的某些功能.
相关编译器选项在相应章节中列出.

使用-features=extensions选项可以编译其他C++编译器通常接受的非标准代码.
必须编译无效代码且不允许修改代码而使之有效时,您可以使用该选项.
本章介绍了使用-features=extensions选项时编译器支持的语言扩展.
注–可以很容易的将每个支持无效代码的实例转变为所有编译器接受的有效代码.
如果允许使代码有效,那么您应该使代码有效而不是使用该选项.
使用-features=extensions选项可以使某些编译器拒绝的无效代码永远存在.
4.
1链接程序作用域可使用下列声明说明符来协助约束外部符号的声明和定义.
文件链接到共享库或可执行文件之前,静态归档或目标文件指定的作用域限制不会生效.
尽管如此,编译器仍然可以执行显示链接程序作用域说明符的某些优化.
通过使用这些说明符,您不必再使用链接程序作用域的mapfile.
也可以通过在命令行上指定-xldscope来控制变量作用域的缺省设置.
有关更多信息,请参见第239页中的"A.
2.
130-xldscope={v}".
表4–1链接程序作用域声明说明符值含义__global符号定义具有全局链接程序作用域,是限制最小的链接程序作用域.
对符号的所有引用都绑定到定义符号的第一个动态装入模块中的定义.
该链接程序作用域是外部符号的当前链接程序作用域.
4第4章57表4–1链接程序作用域声明说明符(续)值含义__symbolic符号定义具有符号链接程序作用域,其限制程度高于全局链接程序作用域.
将对链接的动态装入模块内符号的所有引用绑定到模块内定义的符号.
在模块外部,符号也显示为全局符号.
该链接程序作用域对应于链接程序选项-Bsymbolic.
尽管不能将-Bsymbolic与C++库一起使用,但可以使用__symbolic说明符,而不会引起问题.
有关链接程序的更多信息,请参见ld(1)手册页.
__hidden符号定义具有隐藏的链接程序作用域.
隐藏链接程序作用域具有比符号和全局链接程序作用域更高的限制.
将动态装入模块内的所有引用绑定到该模块内的定义.
符号在模块外部是不可视的.
符号定义可以用更多限制的说明符来重新声明,但是不可以用较少限制的说明符重新声明.
符号定义后,不可以用不同的说明符声明符号.
__global是限制最少的作用域,__symbolic是限制较多的作用域,而__hidden是限制最多的作用域.
因为虚函数的声明影响虚拟表的结构和解释,所以所有虚函数对包括类定义的所有编译单元必须是可视的.
可以将链接程序作用域说明符应用于结构、类、联合声明和定义中,因为C++类可能要求生成隐式信息,如虚拟表和运行时类型信息.
在这种情况下,说明符后跟结构、类或联合关键字.
这种应用程序为其所有隐式成员隐含了相同的链接程序作用域.
4.
1.
1与MicrosoftWindows兼容为了在动态库方面与MicrosoftVisualC++(MSVC++)中的相似作用域功能兼容,也支持以下语法:__declspec(dllexport)等效于__symbolic__declspec(dllimport)等效于__global在OracleSolarisStudioC++中使用此语法时,应将选项-xldscope=hidden添加到CC命令行.
结果与使用MSVC++得到的结果相当.
在MSVC++中,__declspec(dllimport)应当仅用于外部符号的声明,而不用于定义.
示例:__declspec(dllimport)intfoo();//OK__declspec(dllimport)intbar(notOK4.
1链接程序作用域OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0158在MSVC++中,对于将dllimport用于定义没有严格规定,而使用OracleSolarisStudioC++时结果则不同.
尤其是,使用OracleSolarisStudioC++时将dllimport用于定义得到的是具有全局链接的符号而不是符号链接.
MicrosoftWindows上的动态库不支持符号的全局链接.
如果遇到此问题,可以更改源代码,对定义使用dllexport而不是dllimport.
这样,使用MSVC++和使用OracleSolarisStudioC++得到的结果相同.
4.
2线程局部存储通过声明线程局部变量,可以利用线程局部存储.
线程局部变量声明普通变量声明与声明说明符__thread组成.
有关更多信息,请参见第276页中的"A.
2.
174-xthreadvar[=o]".
必须将__thread说明符包括在第一个线程变量声明中.
使用__thread说明符声明的变量的绑定方式与没有__thread说明符时相同.
只能使用__thread说明符声明静态持续时间的变量.
具有静态持续时间的变量包括了文件全局、文件静态、函数局部静态和类静态成员.
不能使用__thread说明符声明动态或自动持续时间的变量.
线程变量可以具有静态初始化函数,但是不可以具有动态初始化函数或析构函数.
例如,允许__threadintx=4;,但不允许__threadintx=f();.
线程变量不能包含具有重要构造函数和析构函数的类型.
具体来说,就是线程变量的类型不能为std::string.
运行时对线程变量的地址运算符(&)求值并返回当前线程变量的地址.
因此,线程变量的地址不是常量.
线程变量的地址在相应线程的生命周期中是稳定的.
进程中任何线程都可以在线程变量的生命周期任意使用该变量的地址.
不能在线程终止后使用线程变量的地址.
线程变量的所有地址在线程终止后都是无效的.
4.
3用限制较少的虚函数覆盖C++标准规定,覆盖虚拟函数在异常中允许的限制不得低于它覆盖的任何函数的限制.
该虚函数可能与覆盖的任何函数具有相同或更多的限制.
注意,不存在异常规范也允许任何异常.
例如,假定通过指向基类的指针调用函数.
如果函数具有异常规范,则可以计算出没有其他正抛出的异常.
如果覆盖函数具有限制较少的规范,则不可预料的异常可能会被抛出,这会导致意外的程序行为并且终止程序.
使用-features=extensions时,编译器允许覆盖异常规范限制较小的函数.
4.
3用限制较少的虚函数覆盖第4章语言扩展594.
4对enum类型和变量进行前向声明使用-features=extensions时,编译器允许对enum类型和变量进行前向声明.
此外,编译器允许声明不完整enum类型的变量.
编译器总是假定不完整enum类型的大小和范围与当前平台上的int类型相同.
以下是两行无效代码示例,如果使用-features=extensions选项,可对其进行编译.
enumE;//invalid:forwarddeclarationofenumnotallowedEe;//invalid:typeEisincomplete因为enum定义不能互相引用,并且enum定义不能交叉引用另一种类型,所以从来不必对枚举类型进行前向声明.
要使代码有效,可以总是先提供enum的完整定义,然后再使用它.
注–在64位体系结构上,enum要求的大小可以比int类型大.
如果是这种情况,并且如果前向声明和定义在同一编译中是可视的,那么编译器将发出错误.
如果实际大小不是假定的大小并且编译器没有发现这个差异,那么代码将编译并链接,但有可能不能正常运行.
可能出现意外的程序行为,尤其是8字节值存储在4字节变量中时.
4.
5使用不完整enum类型使用-features=extensions时,不完整的enum类型以前向声明处理.
例如,以下是无效代码,如果使用-features=extensions选项,可对其进行编译.
typedefenumEF;//invalid,Eisincomplete如前所述,可以总是先包括enum类型的定义,然后再使用.
4.
6将enum名称作为作用域限定符因为enum声明并不引入作用域,所以enum名称不能作为作用域限定符来使用.
例如,以下代码是无效的.
enumE{e1,e2,e3};inti=E::e1;//invalid:Eisnotascopename要编译该无效代码,请使用-features=extensions选项.
-features=extensions选项指示编译器在作用域限定符是enum类型的名称时忽略该作用域限定符.
要使代码有效,请删除无效的限定符E::.
4.
4对enum类型和变量进行前向声明OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0160注–使用该选项提高了排字错误的可能性,产生了编译没有错误消息的错误程序.

4.
7使用匿名struct声明匿名结构声明是既不声明结构标记也不声明对象或typedef名称的声明.
C++中不允许匿名结构.
-features=extensions选项允许使用匿名struct声明,但仅作为联合的成员.
以下代码是无效匿名struct声明示例,如果使用-features=extensions选项,可对其进行编译.
unionU{struct{inta;doubleb;};//invalid:anonymousstructstruct{char*c;unsignedd;};//invalid:anonymousstruct};struct成员的名称是可视的,没有struct成员名称的限定.
如果该代码示例中提供了U的定义,则可以编写:Uu;u.
a=1;匿名结构与匿名联合服从相同的限制.
请注意,可以通过为每个struct提供一个名称以使代码有效,例如:unionU{struct{inta;doubleb;}A;struct{char*c;unsignedd;}B;};Uu;U.
A.
a=1;4.
7使用匿名struct声明第4章语言扩展614.
8传递匿名类实例的地址不允许获取临时变量的地址.
例如,因为以下代码获取了构造函数调用创建的变量地址,所以这些代码是无效的.
但是,如果使用-features=extensions选项,编译器将接受该无效代码.
classC{public:C(int);.
.
.
};voidf1(C*);intmain(){f1(&C(2));//invalid}注意,可以通过使用显式变量来使该代码有效.
Cc(2);f1(&c);函数返回时,临时对象被销毁.
程序员应确保临时变量的地址没有留下.
此外,销毁临时变量(例如f1)时,临时变量中存储的数据会丢失.
4.
9将静态名称空间作用域函数声明为类友元下面的代码是无效的:classA{friendstaticvoidfoo();.
.
.
};因为类名具有外部链接并且所有定义必须是相等的,所以友元函数也必须具有外部链接.
但是,如果使用-features=extensions选项,编译器将接受该代码.
程序员处理该无效代码的方法大概是在类A的实现文件中提供非成员"helper"函数.
可以通过使foo成为静态成员函数得到相同效果.
如果不要客户端调用函数,则可以使该函数私有化.
注–如果使用该扩展,则任何客户端都可以"劫取"您的类.
任何客户端都可以包括类的头文件,然后定义其自身的静态函数foo,该函数将自动成为类的友元.
结果就好像是您使类的所有成员成为了公共的.
4.
8传递匿名类实例的地址OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01624.
10将预定义__func__符号用于函数名编译器将每个函数中的标识符__func__隐式声明为静态constchar数组.
如果程序使用标识符,编译器还会提供以下定义,其中,function-name是函数原始名称.
类成员关系、名称空间和重载不反映在名称中.
staticconstchar__func__[]="function-name";例如,请考虑以下代码段.
#includevoidmyfunc(void){printf("%s\n",__func__);}每次调用函数时,函数将把以下内容打印到标准输出流.
myfunc还会定义标识符__FUNCTION__,它等效于__func__.
4.
11支持的属性支持以下属性:为了实现兼容,编译器会实现由__attribute__((keyword))或[[keyword]]调用的以下属性.
还接受在双下划线内拼写的属性关键字__keyword__.
aligned大致等效于#pragmaalign.
生成警告,且在用于可变长度数组时会被忽略.
always_inline等效于#pragmainline和-xinlineconst等效于#pragmano_side_effectconstructor等效于#pragmainitdestructor等效于#pragmafinimalloc等效于#pragmareturns_new_memorymode(无等效子句)noinline等效于#pragmano_inline和-xinlinenoreturn等效于#pragmadoes_not_returnpure等效于#pragmadoes_not_write_global_datapacked等效于#pragmapack().
请参见以下详细信息.
returns_twice等效于#pragmaunknown_control_flow4.
11支持的属性第4章语言扩展63strong接受它是为了与g++兼容,但不起任何作用.
g++文档建议不要使用该属性.
vector_size指示变量或类型名称(使用typedef创建)表示一个向量.
visibility提供链接程序作用域.
(请参见第239页中的"A.
2.
130-xldscope={v}")语法为:__attribute__((visibility("visibility-type"))),其中visibility-type是以下选项之一:default与__global链接程序作用域相同hidden与__hidden链接程序作用域相同internal与__symbolic链接程序作用域相同weak等效于#pragmaweak4.
11.
1__packed__属性详细信息此属性附加于struct或union类型定义中,它指定结构或联合的每个成员(除了零宽度位字段)的放置,以最大限度地减小所需内存.
附加于enum定义时,__packed__指示应使用最小的整数类型.
为struct和union类型指定此属性等效于对每个结构或联合成员指定packed属性.
在以下示例中,structmy_packed_struct的成员紧紧打包在一起,但其成员的内部布局并不打包.
为此,还需要打包structmy_unpacked_struct.
structmy_unpacked_struct{charc;inti;;struct__attribute__((__packed__))my_packed_struct{charc;inti;structmy_unpacked_structs;};只能对enum、struct或union的定义指定此属性,不能对未定义枚举类型、结构或联合的typedef指定此属性.
4.
11支持的属性OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01644.
12对IntelMMX和扩展的x86平台内部函数的编译器支持mmintrin.
h头文件中声明的原型支持IntelMMX内部函数,是为了实现兼容性而提供的.
特定头文件提供了附加扩展平台内部函数的原型,如下表所示.
表4–2头文件x86平台头文件SSEmmintrin.
hSSE2xmmintrin.
hSSE3pmmintrin.
hSSSE3tmmintrin.
hSSE4Aammintrin.
hSSE4.
1smmintrin.
hSSE4.
2nmmintrin.
hAES加密和PCLMULQDQwmmintrin.
hAVXimmintrin.
h表中每个头文件在其前面都包括了原型.
例如,在SSE4.
1平台上,用户程序中的包含方smmintrin.
h声明了支持SSE4.
1、SSSE3、SSE3、SSE2、SSE和MMX平台的内部函数名称,因为smmintrin.
h包含了tmmintrin.
h,而tmmintrin.
h包含了pmmintrin.
h,并依次向下类推至mmintrin.
h.
请注意,ammintrin.
h是由AMD发布的,未包含在任何Intel内部函数头文件中.
ammintrin.
h包含了pmmintrin.
h,因此,通过将ammintrin.
h包含在内,就可声明所有AMDSSE4A以及IntelSSE3、SSE2、SSE和MMX函数.
另外,单个OracleSolarisStudio头文件sunmedia_intrin.
h包含所有Intel头文件中的声明,但未包含AMD头文件ammintrin.
h.
请注意,在主机平台(例如SSE3)上部署的调用任何超集内部函数(例如,针对AVX)的代码不能在OracleSolaris平台上装入,在Linux平台上装入可能会失败并产生未定义的行为或不正确的结果.
对于调用这些特定于平台的内部函数的程序,请只在支持这些函数的平台上部署这类程序.
这些为系统头文件,应按下例所示显示在程序中:#include4.
12对IntelMMX和扩展的x86平台内部函数的编译器支持第4章语言扩展65有关详细信息,请参阅最新的IntelC++编译器参考指南.
4.
12对IntelMMX和扩展的x86平台内部函数的编译器支持OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0166程序组织C++程序的文件组织需要比典型的C程序更加小心.
本章介绍了如何建立头文件和模板定义.
5.
1头文件创建有效的头文件是很困难的.
头文件通常必须适应C和C++的不同版本.
要提供模板,请确保头文件能容纳多个包含(幂等).
5.
1.
1可适应语言的头文件可能需要开发能够包含在C和C++程序中的头文件.
但是,称为"传统C"的Kernighan和RitchieC(K&C)、ANSIC、AnnotatedReferenceManualC++(ARMC++)以及ISOC++有时要求一个头文件中同一个程序元素有不同的声明或定义.
(有关语言和版本之间的变化的其他信息,请参见《C++迁移指南》.
)要使头文件符合所有这些标准,可能需要根据预处理程序宏__STDC__和__cplusplus的存在情况或值来使用条件编译.
在K&RC中没有定义宏__STDC__,但在ANSIC和C++中都对其进行了定义.
可使用该宏将K&RC代码与ANSIC或C++代码区分开.
该宏最适用于从非原型函数定义中区分原型函数定义.
#ifdef__STDC__intfunction(char*C++&ANSICdeclaration#elseintfunction();//K&RC#endif在C中没有定义宏__cplusplus,但在C++中对其进行了定义.
5第5章67注–早期版本的C++定义了宏c_plusplus,但没有定义cplusplus.
现在已不再定义宏c_plusplus.
可使用__cplusplus宏的定义来区分C和C++.
该宏在保证为函数声明指定extern"C"接口时非常有用,如以下示例所示.
为了防止出现extern"C"指定不一致,切勿将#include指令放在extern"C"链接指定的作用域中.
#include"header.
h"otherincludefiles.
.
.
#ifdefined(__cplusplus)extern"C"{#endifintg1();intg2();intg3()#ifdefined(__cplusplus)}#endif在ARMC++中,__cplusplus宏的值为1.
在ISOC++中,该宏的值为199711L(用long常量表示的标准年月).
使用这个宏的值区分ARMC++和ISOC++.
这个宏值在保护模板语法的更改时极为有用.
//templatefunctionspecialization#if__cplusplusintpower(int,int);//ISOC++#endif5.
1.
2幂等头文件头文件应该具有幂等性,即,多次包括头文件的效果和仅包括一次的效果完全相同.
该特性对于模板尤其重要.
通过设置预处理程序条件以防止头文件体多次出现,可以很好的实现幂等.
#ifndefHEADER_H#defineHEADER_H/*contentsofheaderfile*/#endif5.
1头文件OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01685.
2模板定义可以用两种方法组织模板定义:使用包括的定义和使用独立的定义.
包括的定义组织允许对模板编译进行更多的控制.
5.
2.
1包括的模板定义在将模板的声明和定义放在使用该模板的文件中时,组织是包括定义的组织.
例如:main.
cctemplateNumbertwice(Numberoriginal);templateNumbertwice(Numberoriginal){returnoriginal+original;}intmain(){returntwice(-3);}使用模板的文件包括了包含模板声明和模板定义的文件时,使用模板的该文件的组织也是包括定义的组织.
例如:twice.
h#ifndefTWICE_H#defineTWICE_HtemplateNumbertwice(Numberoriginal);templateNumbertwice(Numberoriginal){returnoriginal+original;}#endifmain.
cc#include"twice.
h"intmain(){returntwice(-3);}注–使模板标题幂等非常重要.
(请参见第68页中的"5.
1.
2幂等头文件".
)5.
2.
2独立的模板定义另一种组织模板定义的方法是将定义保留在模板定义文件中,如以下示例所示.

twice.
h#ifndefTWICE_H#defineTWICE_HtemplateNumbertwice(Numberoriginal);#endifTWICE_H5.
2模板定义第5章程序组织69twice.
cctemplateNumbertwice(Numberoriginal){returnoriginal+original;}main.
cc#include"twice.
h"intmain(){returntwice(-3);}模板定义文件不得包括任何非幂等头文件,而且通常根本不需要包括任何头文件.
(请参见第68页中的"5.
1.
2幂等头文件".
)请注意,并非所有编译器都支持模板的独立定义模型.
一个单独的定义文件作为头文件时,该文件可能会被隐式包括在许多文件中.
因此,它不应该包含任何函数或变量定义,除非这些定义是模板定义的一部分.
一个单独的定义文件可以包含类型定义,包括typedef.
注–尽管通常会使用模板定义文件的源文件扩展名(即.
c、.
C、.
cc、.
cpp、.
cxx或.
c++),但模板定义文件是头文件.
如果需要,编译器会自动包括它们.
模板定义文件不应单独编译.
如果将模板声明放置在一个文件中,而将模板定义放置在另一个文件中,则需仔细考虑如何构造定义文件,如何命名定义文件和如何放置定义文件.
此外也需要向编译器显式指定定义的位置.
有关模板定义搜索规则的信息,请参阅第90页中的"7.
5模板定义搜索".
使用-E或-P选项生成预处理器输出时,定义分离的文件组织不允许在.
i文件中包含模板定义.
编译.
i文件时会因缺少定义而失败.
通过有条件地在模板声明标题中包含模板定义文件(请参见下面的代码示例),可确保通过在命令行中使用-template=no%extdef来使用模板定义.
libCtd和STLport库以此方式实现.
//templacedeclarationfiletemplateclassfoo{.
.
.
};#ifdef_TEMPLATE_NO_EXTDEF#include"foo.
cc"//templatedefinitionfile#endif但是,请勿尝试自行定义宏_TEMPLATE_NO_EXTDEF.
如果定义时没有使用—template=no%extdef选项,可能会因为包含多个模板定义文件而导致编译失败.
5.
2模板定义OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0170创建和使用模板通过模板,可以采用类型安全方法来编写适用于多种类型的单一代码.
本章介绍了模板的概念和函数模板上下文中的术语,讨论了更复杂的(更强大的)类模板,描述了模板的组成,此外还讨论了模板实例化、缺省模板参数和模板专门化.
本章的结尾部分讨论了模板的潜在问题.
6.
1函数模板函数模板描述了仅用参数或返回值的类型来区分的一组相关函数.
6.
1.
1函数模板声明使用模板之前,请先声明.
以下示例中的声明提供了使用模板所需的足够信息,但没有提供实现模板所需的足够信息.
templateNumbertwice(Numberoriginal);在此示例中,Number是模板参数,它指定模板描述的函数范围.
更具体地说,Number是模板类型参数,在模板定义中使用它表示确定的模板使用位置处的类型.

6.
1.
2函数模板定义如果要声明模板,请先定义该模板.
定义提供了实现模板所需的足够信息.
以下示例定义了在前一个示例中声明的模板.
templateNumbertwice(Numberoriginal){returnoriginal+original;}因为模板定义通常出现在头文件中,所以模板定义必须在多个编译单元中重复.
不过所有的定义都必须是相同的.
该限制称为一次定义规则.
6第6章716.
1.
3函数模板用法声明后,模板可以像其他函数一样使用.
它们的使用由命名模板和提供函数参数组成.
编译器可以从函数参数类型推断出模板类型参数.
例如,您可以按以下方式使用以前声明的模板:doubletwicedouble(doubleitem){returntwice(item);}如果模板参数不能从函数参数类型推断出,则调用函数时必须提供模板参数.
例如:templateTfunc();//nofunctionargumentsintk=func();//templateargumentsuppliedexplicitly6.
2类模板类模板描述了一组相关的类或数据类型,它们只能通过类型来区分:整数值、指向(或引用)具有全局链接的变量的指针、其他的组合.
类模板尤其适用于描述通用但类型安全的数据结构.
6.
2.
1类模板声明类模板声明仅提供了类的名称和类的模板参数.
此类声明是不完整的类模板.

以下示例是名为Array类的模板声明,该类可接受任何类型作为参数.
templateclassArray;该模板用于名为String的类,该类接受unsignedint作为参数.
templateclassString;6.
2.
2类模板定义类模板定义必须声明类数据和函数成员,如以下示例所示.
templateclassArray{Elem*data;intsize;public:Array(intsz);intGetSize();Elem&operator[](intidx);};6.
2类模板OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0172templateclassString{chardata[Size];staticintoverflows;public:String(char*initial);intlength();};与函数模板不同,类模板可以同时有类型参数(如classElem)和表达式参数(如unsignedSize).
表达式参数可以是:具有整型或枚举的值指向对象的指针或到对象的引用指向函数的指针或到函数的引用指向类成员函数的指针6.
2.
3类模板成员定义类模板的完整定义需要类模板函数成员和静态数据成员的定义.
动态(非静态)数据成员由类模板声明完全定义.
6.
2.
3.
1函数成员定义模板函数成员的定义由模板参数专门化后跟函数定义组成.
函数标识符通过类模板的类名称和模板参数限定.
以下示例说明了Array类模板的两个函数成员的定义,该模板中指定了模板参数template.
每个函数标识符都通过模板类名称和模板参数Array限定.
templateArray::Array(intsz){size=sz;data=newElem[size];}templateintArray::GetSize(){returnsize;}该示例说明了String类模板的函数成员的定义.
#includetemplateintString::length(){intlen=0;while(lenString::String(char*initial){strncpy(data,initial,Size);if(length()==Size)overflows++;}6.
2.
3.
2静态数据成员定义模板静态数据成员的定义由后跟变量定义的模板参数专门化组成,在此处变量标识符通过类模板名称和类模板实元参数来限定.
6.
2类模板第6章创建和使用模板73templateintString::overflows=0;6.
2.
4类模板的用法模板类可以在使用类型的任何地方使用.
指定模板类包括了提供模板名称和参数的值.
以下示例中的声明根据Array模板创建int_array变量.
变量的类声明及其一组方法类似于Array模板中的声明和方法,只是Elem替换为了int.
请参见第74页中的"6.
3模板实例化".
Arrayint_array(100);此示例中的声明使用String模板创建short_string变量.
Stringshort_string("hello");需要任何其他成员函数时,您可以使用模板类成员函数.
intx=int_array.
GetSize();intx=short_string.
length();.
6.
3模板实例化模板实例化是生成采用特定模板参数组合的具体类或函数(实例).
例如,编译器生成一个采用Array的类,另外生成一个采用Array的类.
通过用模板参数替换模板类定义中的模板参数,可以定义这些新的类.
在第72页中的"6.
2类模板"中介绍的Array示例中,编译器用int替换所有Elem.
6.
3.
1隐式模板实例化使用模板函数或模板类时需要实例.
如果这种实例还不存在,则编译器隐式实例化模板参数组合的模板.
6.
3.
2显式模板实例化编译器仅为实际使用的那些模板参数组合而隐式实例化模板.
该方法不适用于构造提供模板的库.
C++提供了显式实例化模板的功能,如以下示例所示.
6.
3.
2.
1模板函数的显式实例化要显式实例化模板函数,请在template关键字后接函数的声明(不是定义),且函数标识符后接模板参数.
6.
3模板实例化OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0174templatefloattwice(floatoriginal);在编译器可以推断出模板参数时,模板参数可以省略.
templateinttwice(intoriginal);6.
3.
2.
2模板类的显式实例化要显式实例化模板类,请在template关键字后接类的声明(不是定义),且在类标识符后接模板参数.
templateclassArray;templateclassString;显式实例化类时,所有的类成员也必须实例化.
6.
3.
2.
3模板类函数成员的显式实例化要显式实例化模板类函数成员,请在template关键字后接函数的声明(不是定义),且在由模板类限定的函数标识符后接模板参数.
templateintArray::GetSize();templateintString::length();6.
3.
2.
4模板类静态数据成员的显式实例要显式实例化模板类静态数据成员,请在template关键字后接成员的声明(不是定义),且在由模板类限定的成员标识符后接模板参数.
templateintString::overflows;6.
4模板组合可以嵌套使用模板.
这种方式尤其适用于在通用数据结构上定义通用函数,与在标准C++库中相同.
例如,模板排序函数可以通过一个模板数组类进行声明:templatevoidsort(Array);并定义为:templatevoidsort(Arraystore){intnum_elems=store.
GetSize();for(inti=0;istore[j])6.
4模板组合第6章创建和使用模板75{Elemtemp=store[j];store[j]=store[j-1];store[j-1]=temp;}}上述示例定义了针对预先声明的Array类模板对象的排序函数.
下一个示例说明了排序函数的实际用法.
Arrayint_array(100);//constructanarrayofintssort(int_array);//sortit6.
5缺省模板参数您可以将缺省值赋予类模板(但不是函数模板)的模板参数.
templateclassArray;templateclassString;如果模板参数具有缺省值,则该参数后的所有参数也必须具有缺省值.
模板参数仅能具有一个缺省值.
6.
6模板专门化将某些模板参数组合视为一个特殊的参数可以提高性能,如本节中的twice示例所示.
另外,模板说明对于它的一组可能参数也可能不起作用,如本节中的sort示例所示.
模板专门化允许您定义实际模板参数给定组合的可选实现.
模板专门化覆盖了缺省实例化.
6.
6.
1模板专门化声明使用模板参数的组合之前,您必须声明专门化.
以下示例声明了twice和sort的专用实现.
templateunsignedtwice(unsignedoriginal);templatesort(Arraystore);如果编译器可以明确决定模板参数,则您可以省略模板参数.
例如:templateunsignedtwice(unsignedoriginal);templatesort(Arraystore);6.
6.
2模板专门化定义必须定义声明的所有模板专门化.
下例定义了上一节中声明的函数.
6.
5缺省模板参数OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0176templateunsignedtwice(unsignedoriginal){returnoriginaltemplatevoidsort(Arraystore){intnum_elems=store.
GetSize();for(inti=0;i0){char*temp=store[j];store[j]=store[j-1];store[j-1]=temp;}}6.
6.
3模板专门化使用和实例化专门化与其他任何模板一样使用并实例化,除此以外,完全专用模板的定义也是实例化.
6.
6.
4部分专门化在前一个示例中,模板是完全专用的.
也就是说,模板定义了特定模板参数的实现.
模板也可以部分专用,这意味着只有某些模板参数被指定,或者一个或多个参数被限定到某种类型.
生成的部分专门化仍然是模板.
例如,以下代码样例说明了主模板和该模板的完全专门化.
templateclassAprimarytemplatetemplateclassAspecialization以下代码说明了主模板部分专门化的示例.
templateclassAExample1templateclassAclassAExample3示例1提供了用于第一个模板参数是int类型的情况的特殊模板定义.
示例2提供了用于第一个模板参数是任何指针类型的情况的特殊模板定义.
示例3提供了用于第一个模板参数是任何类型的指针到指针而第二个模板参数是char类型的情况的特殊模板定义.
6.
6模板专门化第6章创建和使用模板776.
7模板问题部分本节介绍了使用模板时会遇到的问题.
6.
7.
1非本地名称解析和实例化有时模板定义使用模板参数或模板本身未定义的名称.
如此,编译器解决了封闭模板作用域的名称,该模板可以在定义或实例化点的上下文中.
名称可以在不同的位置具有不同的含义,产生不同的解析.
名称解析比较复杂.
因此,您不应该依赖除一般全局环境中提供的名称外的非本地名称.
也就是说,仅使用在任何地方都用相同方法声明和定义的非本地名称.
在以下示例中,模板函数converter使用了非本地名称intermediary和temporary.
在use1.
cc和use2.
cc中这些名称的定义不同,因此在不同的编译器下可能会生成不同的结果.
为了能可靠地使用模板,所有非本地名称(该示例中为intermediary和temporary)在任何地方都必须有相同的定义.
use_common.
h//CommontemplatedefinitiontemplateTargetconverter(Sourcesource){temporary=(intermediary)source;return(Target)temporary;}use1.
cctypedefintintermediary;inttemporary;#include"use_common.
h"use2.
cctypedefdoubleintermediary;unsignedinttemporary;#include"use_common.
h"一个常见的非本地名称用法是在模板内使用cin和cout流.
有时程序员要将流作为模板参数传递,这时就要引用到全局变量.
但cin和cout在任何地方都必须有相同的定义.
6.
7.
2作为模板参数的本地类型模板实例化系统取决于类型名称,等效于决定哪些模板需要实例化或重新实例化.
因此本地类型用作模板参数时,会导致严重的问题.
小心在代码中也出现类似的问题.

示例6–1本地类型用作模板参数问题的示例array.
htemplateclassArray{Type*data;6.
7模板问题部分OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0178示例6–1本地类型用作模板参数问题的示例(续)intsize;public:Array(intsz);intGetSize();};array.
cctemplateArray::Array(intsz){size=sz;data=newType[size];}templateintArray::GetSize(){returnsize;}file1.
cc#include"array.
h"structFoo{intdata;};ArrayFile1Data(10);file2.
cc#include"array.
h"structFoo{doubledata;};ArrayFile2Data(20);在file1.
cc中注册的Foo类型与在file2.
cc中注册的Foo类型不同.
以这种方法使用本地类型会出现错误和意外的结果.
6.
7.
3模板函数的友元声明模板在使用之前必须先声明.
模板的使用由友元声明构成,不是由模板的声明构成.
实际的模板声明必须在友元声明之前.
例如,编译系统尝试链接以下示例中生成的目标文件时,对未实例化的operatortemplateclassarray{intsize;public:array();friendstd::ostream&operator&);};#endifarray.
cc#include#include6.
7模板问题部分第6章创建和使用模板79示例6–2友元声明问题的示例(续)templatearray::array(){size=1024;}templatestd::ostream&operator&rhs){returnoutrhs.
size#include"array.
h"intmain(){std::coutfoo;std::cout&);因为operator类型的参数,因此必须在声明函数之前声明array.
文件array.
h必须如此示例所示:#ifndefARRAY_H#defineARRAY_H#include//thenexttwolinesdeclareoperatorclassarray;templatestd::ostream&operator&);templateclassarray{intsize;public:array();friendstd::ostream&operator(std::ostream&,constarray&);};#endif6.
7模板问题部分OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01806.
7.
4在模板定义内使用限定名称C++标准要求使用具有限定名的类型,这些限定名取决于要用typename关键字显式标注为类型名称的模板参数.
即使编译器可以推断出它应当为某一类型,也需满足该要求.
以下示例中的注释说明了具有要用typename关键字的限定名的类型.
structsimple{typedefinta_type;staticinta_datum;};intsimple::a_datum=0;//notatypetemplatestructparametric{typedefTa_type;staticTa_datum;};templateTparametric::a_datum=0;//notatypetemplatestructexample{statictypenameT::a_typevariable1;//dependentstatictypenameparametric::a_typevariable2;//dependentstaticsimple::a_typevariable3;//notdependent};templatetypenameT::a_type//dependentexample::variable1=0;//notatypetemplatetypenameparametric::a_type//dependentexample::variable2=0;//notatypetemplatesimple::a_type//notdependentexample::variable3=0;//notatype6.
7.
5嵌套模板名称由于">>"字符序列解释为右移运算符,因此在一个模板名称中使用另一个模板名称时必须小心.
确保相邻的">"字符之间至少有一个空格.
例如,以下是形式错误的语句:Array>short_string_array(100)right-shift被解释为:Array>short_string_array(100);正确的语法为:Array>short_string_array(100);6.
7.
6引用静态变量和静态函数在模板定义中,编译器不支持引用在全局作用域或名称空间中声明为静态的对象或函数.
如果生成了多个实例,由于每个实例引用了不同的对象,因此违背了单次定义规则(C++标准的3.
2节).
通常的失败指示是链接时丢失符号.
6.
7模板问题部分第6章创建和使用模板81如果想要所有模板实例化共享单一对象,那么请使对象成为已命名空间的非静态成员.
如果想要模板类的每个实例化不同对象,那么请使对象成为模板类的静态成员.
如果希望每个模板函数实例化的对象不同,请使对象成为函数的本地对象.

6.
7.
7在同一目录中使用模板生成多个程序如果要通过指定-instances=extern生成多个程序或库,请在不同的目录中生成这些程序或库.
如果要在同一目录中生成多个程序,则在各次生成之间需要清除系统信息库.
该做法可以避免出现任何不可预料的错误.
有关更多信息,请参见第90页中的"7.
4.
4共享模板系统信息库".
考虑以下包含makefilea.
cc、b.
cc、x.
h和x.
cc.
的示例请注意,仅当指定了-instances=extern时,该示例才有意义:.
.
.
.
.
.
.
.
Makefile.
.
.
.
.
.
.
.
CCC=CCall:aba:$(CCC)-I.
-instances=extern-ca.
cc$(CCC)-instances=extern-oaa.
ob:$(CCC)-I.
-instances=extern-cb.
cc$(CCC)-instances=extern-obb.
oclean:/bin/rm-rfSunWS_cache*.
oab.
.
.
x.
h.
.
.
templateclassX{public:intopen();intcreate();staticintvariable;};.
.
.
x.
cc.
.
.
templateintX::create(){returnvariable;}templateintX::open(){returnvariable;}templateintX::variable=1;6.
7模板问题部分OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0182.
.
.
a.
cc.
.
.
#include"x.
h"intmain(){Xtemp1;temp1.
open();temp1.
create();}.
.
.
b.
cc.
.
.
#include"x.
h"intmain(){Xtemp1;temp1.
create();}如果同时生成a和b,请在两个生成之间添加makeclean.
以下命令会引起错误:example%makeaexample%makeb以下命令不会产生任何错误:example%makeaexample%makecleanexample%makeb6.
7模板问题部分第6章创建和使用模板8384编译模板C++编译器在模板编译方面处理的工作要比传统UNIX编译器处理的工作多.
C++编译器必须按需为模板实例生成目标代码.
该编译器会使用模板系统信息库在多个独立的编译间共享模板实例,此外还接受某些模板编译选项.
编译器必须在各个源文件中定位模板定义,并维护模板实例和主线代码之间的一致性.
7.
1详细编译如果指定了标志-verbose=template,C++编译器会在编译模板期间针对重要事件向您发送通知.
但是如果使用缺省值-verbose=no%template,则编译器不会发出通知.
+w选项可以在进行模板实例化时提供其他有关潜在问题的指示信息.
7.
2系统信息库管理CCadmin(1)命令管理模板系统信息库(只能与选项-instances=extern一起使用).
例如,程序中的更改会造成某些实例化过度,这样会浪费存储空间.
CCadmin–clean命令(以前是ptclean)清除所有实例及关联数据.
实例化仅在需要时才重新创建.
7.
2.
1生成的实例为了生成模板实例,编译器将内联模板函数看作内联函数.
编译器像管理其他内联函数一样管理这些内联模板函数,另外本章中的说明不适用于模板内联函数.

7.
2.
2整个类实例化编译器通常是分别实例化各个模板类成员,因此,编译器仅实例化程序中使用的成员.
仅用于调试器的方法会因此而不正常地实例化.
可使用两种策略确保调试成员可供调试器使用.
7第7章85首先,编写使用模板类实例成员(否则无用)的非模板函数,不需要调用该函数.

其次,使用-template=wholeclass编译器选项,该选项指示编译器实例化模板类的所有非模板非内联成员(如果实例化这些相同成员中的任何一个).
ISOC++标准允许开发者编写模板类,对于这些类,可能并不是所有成员都可以合法使用某个给定模板参数.
只要非法成员未被实例化,程序就仍然完好.
ISOC++标准库使用了这种技术.
但是,-template=wholeclass选项会实例化所有成员,因此不能用于此类使用有问题的模板参数实例化的模板类.
7.
2.
3编译时实例化实例化是C++编译器从模板创建可用的函数或对象的过程.
C++编译器使用了编译时实例化,在编译对模板的引用时强制进行实例化.
编译时实例化的优点是:调试更加简单.
错误消息出现在上下文中,使得编译器可以给出到引用点的完整回溯.
模板实例化始终保持最新.
包括链接阶段在内的总编译时间减少了.
如果源文件位于不同的目录或您使用了具有模板符号的库,则模板可以多次实例化.

7.
2.
4模板实例的放置和链接缺省情况下,实例会进入特殊地址区域,链接程序会识别并丢弃重复项.
您可以指示编译器使用五个实例放置和链接方法之一:外部、静态、全局、显式和半显式.
在下列情况下,外部实例可以达到最佳的执行效果:程序中的实例集比较小,但是每个编译单元引用了实例较大的子集.
少数实例是在多于一个或两个编译单元中引用的.
静态实例已过时.
缺省的全局实例适用于所有开发,并且在对象引用各种实例时可以达到最佳的执行效果.
显式实例适用于某些需精确控制的应用程序编译环境.
半显式实例对编译环境的控制要求较少,但是生成的目标文件较大,并且使用有限制.
本节讨论了五种实例放置和链接方法.
第74页中的"6.
3模板实例化"中提供了有关生成实例的其他信息.
7.
2系统信息库管理OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01867.
3外部实例对于外部实例方法,所有实例都放置在模板系统信息库中.
编译器确保只有一个一致的模板实例存在;这些实例既不是未定义的也不是多重定义的.
模板仅在需要时才重新实例化.
对于非调试代码,所有目标文件(包括模板缓存中的任何目标文件)在使用-instances=extern时的大小总量可能会小于在使用-instances=global时的大小总量.
模板实例接受系统信息库中的全局链接.
实例是使用外部链接从当前编译单元引用的.
注–如果在不同的步骤中进行编译和链接,并且在编译步骤中指定了-instance=extern,则还必须在链接步骤中指定该选项.
这种方法的缺点是每当您更改程序或进行重大程序更改时都必须清除高速缓存.
高速缓存是并行编译的瓶颈,这与使用dmake时一样,因为每次只能有一个编译访问高速缓存.
另外,您只能在每个目录内生成一个程序.
与在主目标文件中直接创建有效模板实例并在以后丢弃该实例(如果需要)相比,确定某个有效实例是否已在高速缓存中可能需要更长的时间.
使用-instances=extern选项指定外部链接.
因为实例存储在模板系统信息库中,所以必须使用CC命令将使用外部实例的C++对象链接到程序中.
如果要创建包含了使用的所有模板实例的库,请使用-xar选项进行编译.
而不要使用ar命令.
例如:example%CC-xar-instances=extern-olibmain.
aa.
ob.
oc.
o7.
3.
1可能的高速缓存冲突如果指定了-instance=extern,请勿在同一目录中运行不同的编译器版本,以避免可能的高速缓存冲突.
使用-instances=extern模板模型进行编译时,请注意以下事项:请勿在同一目录中创建不相关的二进制文件.
在同一目录中创建的所有二进制文件(.
o、.
a、.
so、可执行程序)都应该相关,因为两个或两个以上目标文件通用的所有对象、函数和类型的名称都具有相同的定义.
在同一目录中同时运行多个编译是安全的,例如使用dmake时.
与另外一个链接步骤同时运行任何编译或链接步骤是不安全的.
链接步骤是指用于创建库或可执行程序的任何操作.
确保makefile中的依赖性不允许任何命令与链接步骤以并行方式运行.
7.
3外部实例第7章编译模板877.
3.
2静态实例注–-instances=static选项已过时,因为-instances=global现在提供了static的所有优点,并克服了其缺点.
早期的编译器中提供了此选项来克服现已不存在的问题.

对于静态实例方法,所有实例都被放置在当前编译单元内.
因此,模板在每个重新编译期间重新实例化;这些实例不保存到模板系统信息库.
这种方法的缺点是不遵循语言语义,并且会生成很大的对象和可执行文件.

实例接收静态链接.
这些实例在当前编译单元外部是不可视的或不可用的.
因此,模板可以在多个目标文件中具有相同的实例化.
因为多重实例产生了不必要的大程序,所以对于不可能多重实例化模板的小程序可以使用静态实例链接.
静态实例的编译速度很快,因此这种方法也适用于修复并继续方式的调试.
(请参见《使用dbx调试程序》.
)注–如果您的程序取决于多个编译单元间的共享模板实例(例如模板类或模板函数的静态数据成员),请勿使用静态实例方法.
否则程序会工作不正常.
可使用-instances=static编译器选项指定静态实例链接.
7.
3.
3全局实例与早期的编译器发行版不同,现在不必预防出现一个全局实例有多个副本的情况.

这种方法的优点是通常由其他编译器接受的不正确源代码也能在这种模式中接受.
需要特别指出的是,从模板实例内对静态变量的引用是不合法的,但通常是可以接受的.
这种方法的缺点是单个目标文件可能会较大,因为可能会在多个文件中存在模板实例的多个副本.
如果编译目标文件以便进行调试时,有些使用了-g选项,而有些没有使用该选项,则很难预测是获得链接到程序中模板实例的调试版本还是非调试版本.

模板实例接收全局链接.
这些实例在当前编译单元外部是可视的和可用的.

可使用-instances=global选项(缺省值)指定全局实例.
7.
3.
4显式实例在显式实例方法中,仅为显式实例化的模板生成实例.
隐式实例化不能满足该要求.
实例被放置在当前编译单元内.
这种方法的优点是拥有最少的模板编译和最小的对象大小.
7.
3外部实例OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0188缺点是您必须手动执行所有的实例化.
模板实例接收全局链接.
这些实例在当前编译单元外部是可视的和可用的.
链接程序识别并丢弃重复项目.
可使用-instances=explicit选项指定显式实例.
7.
3.
5半显式实例使用半显式实例方法时,仅为显式实例化或模板体内隐式实例化的模板生成实例.
显式创建的实例所必需的实例将自动生成.
主线代码中隐式实例化不满足该要求.
实例被放置在当前编译单元内.
因此,模板在每个重新编译期间重新实例化;生成的实例接收全局链接,且不会被保存到模板系统信息库中.
可使用-instances=semiexplicit选项指定半显式实例.
7.
4模板系统信息库在各次编译之间,模板系统信息库存储模板实例,以便仅在需要时编译模板实例.
模板系统信息库包含了使用外部实例方法时模板实例化所需的所有非源文件.
系统信息库不用于其他种类的实例.
7.
4.
1系统信息库结构缺省情况下,模板系统信息库位于名为SunWS_cache的高速缓存目录中.
高速缓存目录包含在放置目标文件的目录中.
可以通过设置环境变量SUNWS_CACHE_NAME更改高速缓存目录的名称.
请注意,SUNWS_CACHE_NAME变量值必须是目录名称,而不能是路径名.
编译器会自动将模板高速缓存目录放置到目标文件目录下,因此编译器已具有路径.
7.
4.
2写入模板系统信息库编译器必须存储模板实例时,编译器将模板实例存储在对应于输出文件的模板系统信息库中.
例如,以下命令将目标文件写入.
/sub/a.
o并将模板实例写入包含在.
/sub/SunWS_cache中的系统信息库.
如果高速缓存目录不存在,且编译器需要对模板进行实例化,则编译器将创建该目录.
example%CC-osub/a.
oa.
cc7.
4模板系统信息库第7章编译模板897.
4.
3从多模板系统信息库读取编译器从对应于编译器读取的目标文件的模板系统信息库读取.
例如,以下命令从.
/sub1/SunWS_cache和.
/sub2/SunWS_cache进行读取,并且在必要时向.
/SunWS_cache进行写入.
example%CCsub1/a.
osub2/b.
o7.
4.
4共享模板系统信息库系统信息库中的模板不得违反ISOC++标准的一次定义规则.
也就是说,使用所有的模板时模板必须具有相同的源.
违反该规则会产生不可预料的行为.
确保不违反该规则的最简单和最保守的方法是在任何一个目录内仅生成一个程序或库.
两个不相关的程序可以使用相同类型的名称或外部名称来表示不同的内容.
如果程序共享模板系统信息库,则模板定义会出现冲突,会产生不可预料的结果.

7.
4.
5通过-instances=extern实现模板实例自动一致如果指定了-instances=extern,模板系统信息库管理器可确保系统信息库中实例的状态与源文件一致且是最新的.
例如,如果您的源文件是使用-g选项(启用调试)编译的,则还会使用-g编译来自数据库中的所需文件.
此外,模板系统信息库会跟踪编译中的更改.
例如,如果设置了-DDEBUG标志来定义名称DEBUG,则数据库中会记录该信息.
如果在以后的编译中省略该标志,则编译器重新实例化设置依赖性的这些模板.
注–如果删除模板的源代码或停止使用模板,模板的实例会保留在缓存中.
如果更改函数模板的签名,使用旧签名的实例会保留在缓存中.
如果因为这些问题在编译时或链接时遇到了异常行为,请清除模板缓存并重新生成程序.
7.
5模板定义搜索使用独立定义模板组织时,模板定义在当前编译单元不可用,编译器必须搜索该定义.
本节介绍了编译器如何找到定义.
定义搜索有些复杂,并且很容易出现错误.
因此如果可能,您应该使用定义包括模板文件组织.
这样有助于避免一起定义搜索.
请参见第69页中的"5.
2.
1包括的模板定义".
7.
5模板定义搜索OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0190注–如果使用-template=no%extdef选项,编译器将不搜索单独的源文件.
7.
5.
1源文件位置约定如果没有随选项文件一起提供的特定方向,则编译器使用Cfront样式的方法来定位模板定义文件.
此方法要求模板定义文件包含的基名与模板声明文件包含的基名相同.
此方法还要求模板定义文件位于当前include路径中.
例如,如果模板函数foo()位于foo.
h中,匹配的模板定义文件应该命名为foo.
cc或某些其他可识别的源文件扩展名(.
C、.
c、.
cc、.
cpp、.
cxx或.
c++).
模板定义文件必须位于常规的include目录之一中,或位于与其匹配的头文件所在目录中.
7.
5.
2定义搜索路径可以用另外一种方法替代用–I设置的常规搜索路径,即使用选项–ptidirectory指定模板定义文件的搜索目录.
多个-pti标志定义多个搜索目录,即搜索路径.
如果使用-ptidirectory,则编译器在该路径查找模板定义文件并忽略–I标志.
由于-ptidirectory标志会使源文件的搜索规则变得复杂,因此应使用-I选项而不是-ptidirectory选项.
7.
5.
3诊断有问题的搜索有时,编译器会生成令人费解的警告或错误消息,因为它会查找您不打算编译的文件.
此问题通常是由于已有某个文件(如foo.
h)包含了模板声明,但又隐式包含了另一个文件(如foo.
cc).
如果头文件foo.
h有模板声明,缺省情况下,编译器会搜索名为foo且具有C++文件扩展名(.
C、.
c、.
cc、.
cpp、.
cxx或.
c++)的文件.
如果找到这样的文件,编译器将自动把它包含进来.
有关这些搜索的更多信息,请参见第90页中的"7.
5模板定义搜索".
如果有一个不打算这样处理的文件foo.
cc,有两种解决方法:更改.
h或.
cc文件的名称,以消除名称匹配.
可以通过指定-template=no%extdef选项来禁用对模板定义文件的自动搜索.
然后必须在代码中显式包含所有模板定义,并且不能使用"独立定义"模型.
7.
5模板定义搜索第7章编译模板9192异常处理本章讨论了C++编译器的异常处理实现.
第102页中的"10.
2在多线程程序中使用异常"中提供了附加信息.
有关异常处理的更多信息,请参见由BjarneStroustrup编著的《TheC++ProgrammingLanguage》第三版(Addison-Wesley出版,1997年).
8.
1同步和异步异常异常处理旨在仅支持同步异常,例如数组范围检查.
同步异常这一术语意味着异常只能源于throw表达式.
C++标准支持具有终止模型的同步异常处理.
终止意味着一旦抛出异常,控制永远不会返回到抛出点.
异常处理不能用于直接处理诸如键盘中断等异步异常.
不过,如果小心处理,在出现异步事件时也可以进行异常处理.
例如,要用信号进行异常处理工作,您可以编写设置全局变量的信号处理程序,并创建另外一个例程来定期轮询该变量的值,当该变量值发生更改时抛出异常.
不能从信号处理程序抛出异常.
8.
2指定运行时错误五个运行时错误消息与异常相关:没有异常处理程序抛出了意外的异常异常只能在处理程序中重新抛出在堆栈展开时,析构函数必须处理自身的异常内存不足运行时检测到错误时,错误消息会显示当前异常的类型和这五个错误消息之一.
缺省情况下,会调用预定义的函数terminate(),该函数又会调用abort().
8第8章93编译器使用异常规范中提供的信息来优化代码生成.
例如,禁止不抛出异常的函数表条目,而函数异常规范的运行时检查在任何可能的地方被消除.
8.
3禁用异常如果知道程序中未使用异常,可以使用编译器选项features=no%except抑制支持异常处理的代码的生成.
该选项的使用可以稍微减小代码的大小,并能加快代码的执行速度.
不过,用禁用的异常编译的文件链接到使用异常的文件时,在用禁用的异常编译的文件中的某些局部对象在发生异常时不会销毁.
缺省情况下,编译器生成支持异常处理的代码.
除非时间和空间开销是要考虑的重要因素,否则将异常保留为启用状态通常更好.
注–因为C++标准库dynamic_cast和缺省运算符new要求使用异常,所以在标准模式(缺省模式)下编译时不应禁用异常.
8.
4使用运行时函数和预定义的异常标准头文件提供了C++标准中指定的类和异常相关函数.
仅在标准模式(编译器缺省模式,或使用选项-compat=5)下编译时才可访问该头文件.
以下摘录的部分代码显示了头文件声明.
//standardheadernamespacestd{classexception{exception()throw();exception(constexception&)throw();exception&operator=(constexception&)throw();virtual~exception()throw();virtualconstchar*what()constthrow();};classbad_exception:publicexception{.
.
.
};//Unexpectedexceptionhandlingtypedefvoid(*unexpected_handler)();unexpected_handlerset_unexpected(unexpected_handler)throw();voidunexpected();//Terminationhandlingtypedefvoid(*terminate_handler)();terminate_handlerset_terminate(terminate_handler)throw();voidterminate();booluncaught_exception()throw();}标准类exception是所选语言构造或C++标准库抛出的所有异常的基类.
可以构造、复制及销毁类型为exception的对象,而不会生成异常.
虚拟成员函数what()返回描述异常的字符串.
8.
3禁用异常OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0194为了与C++4.
2版中所用的异常兼容,还提供了头文件以用于标准模式下.
该头文件允许转换到标准C++代码,并包含了不是标准C++部分的声明.
应在开发进度计划许可的情况下,更新代码以遵循C++标准(使用而非).
//header,usedfortransition#include#includeusingstd::exception;usingstd::bad_exception;usingstd::set_unexpected;usingstd::unexpected;usingstd::set_terminate;usingstd::terminate;typedefstd::exceptionxmsg;typedefstd::bad_exceptionxunexpected;typedefstd::bad_allocxalloc;8.
5将异常与信号和Setjmp/Longjmp混合使用可以在会出现异常的程序中使用setjmp/longjmp函数,只要它们不会互相影响.
使用异常和setjmp/longjmp的所有规则分别适用.
此外,仅当在点A抛出与在点B捕获的异常具有相同的效果时,从点A到点B的longjmp才有效.
需特别指出的是,不得使用longjmp进入或跳出try块或catch块(直接或间接),或使用longjmp跳过自动变量或临时变量的初始化或non-trivial销毁.
不能从信号处理程序抛出异常.
8.
6生成具有异常的共享库对于包含C++代码的程序,请勿使用-Bsymbolic.
请改用链接程序映射文件或链接程序作用域选项.
请参见第57页中的"4.
1链接程序作用域".
如果使用-Bsymbolic,不同模块中的引用可能会绑定到应是一个全局对象的不同副本.
异常机制依赖对地址的比较.
如果您具有某项内容的两个副本,它们的地址就不等同且异常机制可能失败,这是由于异常机制依赖对假设为唯一地址内容的比较.

8.
6生成具有异常的共享库第8章异常处理9596改善程序性能采用编译器易于编译优化的方式编写函数,可以改善C++函数的性能.
很多书中都对软件性能做了一般性介绍并具体介绍了C++,本章不再重复这类重要信息,而只讨论那些显著影响C++编译器的性能策略.
9.
1避免临时对象C++函数经常会产生必须创建并销毁的隐式临时对象.
对于重要的类,临时对象的创建和销毁会占用很多处理时间和内存.
C++编译器消除了某些临时类,但是并不能消除所有的临时类.
编写函数时,在确保您的程序易于理解的同时请尽量减少临时对象的数目.
这些技术包括:使用显式变量而不使用隐式临时对象,以及使用引用变量而不使用值参数.
另外一种技术是实现和使用诸如+=这样的操作,而非实现和使用只包含+和=的操作.
例如,下面的第一行引入了用于保存a+b结果的临时对象,而第二行则不是.
Tx=a+b;Tx(a);x+=b;9.
2使用内联函数使用扩展内联而不使用正常调用时,对小而快速的函数的调用可以更小更快速.
反过来,如果使用扩展内联而不建立分支,则对又长又慢的函数的调用会更大更慢.
另外,只要函数定义更改,就必须重新编译对内联函数的所有调用.
因此,使用内联函数时要格外小心.
如果预计函数定义会更改而且重新编译所有调用程序非常耗时,请不要使用内联函数.
而如果扩展函数内联的代码比调用函数的代码少,或使用函数内联时应用程序执行速度显著提高,则可以使用内联函数.
9第9章97编译器不能内联所有函数调用,因此要充分利用函数内联,可能需要进行一些源码更改.
可使用+w选项了解何时不会进行函数内联.
在以下情况中,编译器将不会内联函数:函数包含了复杂控制构造,例如循环、switch语句和try/catch语句.
这些函数很少多次执行复杂控制构造.
要内联这种函数,请将函数分割为两部分:里边的部分包含复杂的控制构造,而外边的部分决定何时调用里边的部分.
即使编译器可以内联完整函数,从函数常用部分中分隔出不常用部分的这种技术也可以改善性能.

内联函数体又大又复杂.
因为对函数体内其他内联函数的调用,或因为隐式构造函数和析构函数调用(通常发生在派生类的构造函数和析构函数中),所以简单函数体可以非常复杂.
对于这种函数,内联扩展很少提供显著的性能改善,所以函数一般不内联.
内联函数调用的参数既大又复杂.
对于内联成员函数调用的对象是内联函数调用的自身这种情况,编译器特别敏感.
要内联具有复杂参数的函数,只需将函数参数计算到局部变量并将变量传递到函数.
9.
3使用缺省运算符如果类定义不声明无参数的构造函数、复制构造函数、复制赋值运算符或析构函数,那么编译器将隐式声明它们.
它们都是调用的缺省运算符.
类似C的结构具有这些缺省运算符.
编译器生成缺省运算符时,可以了解大量关于需要处理的工作和可以产生优良代码的工作.
这种代码通常比用户编写的代码的执行速度快,原因是编译器可以利用汇编级功能的优点,而程序员则不能利用该功能的优点.
因此缺省运算符执行所需的工作时,程序不能声明这些运算符的用户定义版本.
缺省运算符是内联函数,因此内联函数不合适时不使用缺省运算符(请参见上一节).
否则,缺省运算符适用于以下情况:用户编写的无参数构造函数仅为构造函数的基对象和成员变量调用无参数构造函数.
有效的基元类型具有"不进行任何操作"的无参数构造函数.
用户编写的复制构造函数仅复制所有的基对象和成员变量.
用户编写的复制赋值运算符仅复制所有的基对象和成员变量.
用户编写的析构函数可以为空.
某些C++编程手册建议编写类的程序员始终定义所有的运算符,以便该代码的任何读者都能了解该程序员没有忘记考虑缺省运算符的语义.
显然,该建议与以上讨论的优化有冲突.
这种冲突的解决方案是在代码中放置注释以表明类正使用缺省运算符.

9.
3使用缺省运算符OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01989.
4使用值类包括结构和联合在内的C++类通过值来传递和返回.
对于Plain-Old-Data(POD)类,C++编译器需要像C编译器一样传递结构.
这些类的对象直接进行传递.
对于包含用户定义复制构造函数的类的对象,要求编译器有效地构造对象的副本,将指针传递到副本,并在返回后销毁副本.
这些类的对象间接进行传递.
编译器也可以选择介于这两个需求之间的类.
不过,该选择影响二进制的兼容性,因此编译器对每个类的选择必须保持一致.
对于大多数编译器,直接传递对象可以加快执行速度.
这种执行速度的改善对于小值类(例如复数和概率值)来说尤其明显.
有时为了改善程序执行效率,您可以设计更可能直接传递而不是间接传递的类.
如果类具有以下任何一个特征,则它将间接传递:用户定义的复制构造函数用户定义的析构函数间接传递的基间接传递的非静态数据成员否则,类被直接传递.
9.
4.
1选择直接传递类尽可能直接传递类:只要可能,就使用缺省构造函数,尤其是缺省复制构造函数.
尽可能使用缺省析构函数.
由于缺省析构函数不是虚拟的,因此具有缺省析构函数的类通常不是基类.
避免使用虚函数和虚拟基.
9.
4.
2在不同的处理器上直接传递类C++编译器直接传递的类和联合与C编译器传递结构或联合完全相同.
不过,C++结构和联合在不同的体系结构上进行不同的传递.
表9–1在不同体系结构上结构和联合的传递体系结构说明SPARCV7/V8通过在调用程序内分配存储并将指针传递到该存储,传递并返回结构和联合.
(也就是说,所有的结构和联合都通过引用传递.
)9.
4使用值类第9章改善程序性能99表9–1在不同体系结构上结构和联合的传递(续)体系结构说明SPARCV9不超过16个字节(32个字节)的结构在寄存器中传递.
通过在调用程序内分配存储并将指针传递到该存储,传递并返回联合和所有其他结构.
(也就是说,小的结构在寄存器中传递,而联合和大的结构通过引用传递.
)因此,小值类与基元类具有相同的传递效率.
x86平台结构和联合通过在堆栈上分配空间并将参数复制到堆栈上来传递.
通过在调用程序的帧中分配临时对象并将临时对象的地址作为隐式的第一个参数传递,返回结构和联合.
9.
5缓存成员变量访问成员变量是C++成员函数的通用操作.
编译器必须经常通过this指针从内存装入成员变量.
因为值通过指针装入,所以编译器有时不能决定何时执行第二次装入或以前装入的值是否仍然有效.
在这些情况下,编译器必须选择安全但缓慢的方法,在每次访问成员变量时重新装入成员变量.

如下所示,可以通过在局部变量中显式缓存成员变量的值来避免不必要的内存重新装入:声明局部变量并使用成员变量的值初始化该变量.
在函数中成员变量的位置使用局部变量.
如果局部变量变化,那么将局部变量的最终值赋值到成员变量.
不过,如果成员函数在该对象上调用另一个成员函数,那么该优化会产生不可预料的结果.

当值位于寄存器中时,这种优化最有效,而这种情况也与基元类型相同.
基于内存的值的优化也会很有效,因为减少的别名使编译器获得了更多的机会来进行优化.

如果成员变量经常通过引用(显式或隐式)来传递,那么优化可能并没什么效果.

有时,类的目标语义需要成员变量的显式缓存,例如在当前对象和其中一个成员函数参数之间有潜在别名时.
例如:complex&operator*=(complex&left,complex&right){left.
real=left.
real*right.
real+left.
imag*right.
imag;left.
imag=left.
real*right.
imag+left.
image*right.
real;}会产生不可预料的结果,前提是调用时使用:x*=x;9.
5缓存成员变量OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01100生成多线程程序本章解释了如何生成多线程程序.
此外,还讨论了异常的使用,解释了如何在线程之间共享C++标准库对象,此外还描述了如何在多线程环境中使用传统(旧的)iostream.
有关多线程的更多信息,请参见《多线程编程指南》.
另请参见《OpenMPAPI用户指南》,了解有关使用OpenMP共享内存并行化指令来创建多线程程序的信息.
10.
1生成多线程程序C++编译器附带的所有库都是多线程安全的.
如果需要生成多线程应用程序,或者需要将应用程序链接到多线程库,必须使用–mt选项编译和链接程序.
此选项会将–D_REENTRANT传递给预处理程序,并按正确的顺序将–lthread链接到ld.
缺省情况下,-mt选项可确保libthread在libCrun之前链接.
推荐使用—mt,这是指定宏和库的替代方式,它更加简单且不易出错.
10.
1.
1表明多线程编译可以通过使用ldd命令检查应用程序是否链接到libthread:example%CC-mtmyprog.
ccexample%ldda.
outlibm.
so.
1=>/usr/lib/libm.
so.
1libCrun.
so.
1=>/usr/lib/libCrun.
so.
1libthread.
so.
1=>/usr/lib/libthread.
so.
1libc.
so.
1=>/usr/lib/libc.
so.
1libdl.
so.
1=>/usr/lib/libdl.
so.
110第10章10110.
1.
2与线程和信号一起使用C++支持库C++支持库libCrun、libiostream和libCstd是多线程安全的,但不是async安全的.
因此,在多线程应用程序中,支持库中可用的函数不能用于信号处理程序中.
这样做的话将导致死锁状态.
在多线程应用程序的信号处理程序中使用以下功能是不安全的:iostreamnew和delete表达式异常10.
2在多线程程序中使用异常对于多线程而言,当前的异常处理实现是安全的,因为一个线程中的异常与其他线程中的异常互不影响.
不过,您不能使用异常来进行线程之间的通信,因为一个线程中抛出的异常不会被其他线程捕获到.
每个线程都可设置其自己的terminate()或unexpected()函数.
在一个线程中调用set_terminate()或set_unexpected()只影响该线程中的异常.
对于任何线程,terminate()的缺省函数是abort()(请参见第93页中的"8.
2指定运行时错误").
10.
2.
1线程取消通过调用pthread_cancel(3T)取消线程会导致销毁堆栈上的自动(局部非静态)对象,但指定了-noex或-features=no%except时例外.
pthread_cancel(3T)使用的机制与异常相同.
取消线程时,局部析构函数与用户通过pthread_cleanup_push()注册的清除例程交叉执行.
在特定的清除例程注册之后,函数调用的本地对象在例程执行前就被销毁了.
10.
3在线程之间共享C++标准库对象C++标准库(libCstd-library=Cstd)是MT安全的,但具有某些语言环境异常.
它确保该库的内部结构在多线程环境中正常运行.
但是,您仍需要将您自己在各个线程之间共享的任何库对象锁定起来.
请参见setlocale(3C)和attributes(5)手册页.
例如,如果实例化字符串,然后创建新的线程并使用引用将字符串传递给线程,因为要在线程之间显示共享这个字符串对象,所以您必须锁定对于该字符串的写访问.
(库提供的用于完成该任务的工具在下文中会有描述.
)10.
2在多线程程序中使用异常OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01102另一方面,如果将字符串按值传递给新线程,即使两个不同的线程中的字符串应用RogueWave的"copyonwrite(写时复制)"技术共享表示,也不必担心锁定.
库将自动处理锁定.
只有当要使对象显式可用于多线程或在线程之间传递引用,以及使用全局或静态对象时,您才需要锁定.
C++标准库在内部使用锁定(同步)机制来确保在多线程下的行为正确,该机制可以描述如下:_RWSTDMutex和_RWSTDGuard这两个同步类提供了实现多线程安全的机制.
_RWSTDMutex类通过下列成员函数提供了与平台无关的锁定机制:voidacquire()-自己获取锁定,或者在获得此类锁定之前一致处于阻塞状态.
voidrelease()-自己释放锁定.
class_RWSTDMutex{public:_RWSTDMutex();~_RWSTDMutex();voidacquire();voidrelease();};_RWSTDGuard类是封装有_RWSTDMutex类的对象的公用包装器类.
_RWSTDGuard对象尝试在其构造函数中获取封装的互斥锁(抛出从std::exceptiononerror派生的::thread_error类型的异常),并在析构函数中释放互斥锁(析构函数从来不会抛出异常).
class_RWSTDGuard{public:_RWSTDGuard(_RWSTDMutex&);~_RWSTDGuard();};另外,可以使用宏_RWSTD_MT_GUARD(mutex)(以前的_STDGUARD)有条件地在多线程生成中创建_RWSTDGuard的对象.
该对象保护代码块的其余部分,并在该代码块中定义为可同时被多个线程执行.
在单线程生成中,宏扩展到空表达式中.
以下示例说明了这些机制的使用.
#include////Anintegersharedamongmultiplethreads.
//intI;////AmutexusedtosynchronizeupdatestoI.
//10.
3在线程之间共享C++标准库对象第10章生成多线程程序103_RWSTDMutexI_mutex;////IncrementIbyone.
Usesan_RWSTDMutexdirectly.
//voidincrement_I(){I_mutex.
acquire();//Lockthemutex.
I++;I_mutex.
release();//Unlockthemutex.
}////DecrementIbyone.
Usesan_RWSTDGuard.
//voiddecrement_I(){_RWSTDGuardguard(I_mutex);//AcquirethelockonI_mutex.
--I;////ThelockonIisreleasedwhendestructoriscalledonguard.
//}10.
4内存边界内部函数编译器提供头文件mbarrier.
h,此头文件中针对SPARC和x86处理器定义了多种内存边界内部函数.
这些内部函数可在开发者使用自己的同步基元编写多线程代码时使用.
请参阅相应的处理器文档,以确定在特定情况下是否需要以及何时需要使用这些内部函数.
mbarrier.
h头文件支持以下内存排序内部函数:__machine_r_barrier()-这是读取边界.
它确保边界前的所有装入操作能够在边界后的所有装入操作之前完成.
__machine_w_barrier()-这是写入边界.
它确保边界前的所有存储操作能够在边界后的所有存储操作之前完成.
__machine_rw_barrier()-这是读写边界.
它确保边界前的所有装入和存储操作能够在边界后的所有装入和存储操作之前完成.
__machine_acq_barrier()-这是具有获取语义的边界.
它确保边界前的所有装入操作能够在边界后的所有装入和存储操作之前完成.
__machine_rel_barrier()-这是具有释放语义的边界.
它确保边界前的所有装入和存储操作能够在边界后的所有存储操作之前完成.
__compiler_barrier()-阻止编译器跨边界移动内存访问.
内部函数__compiler_barrier()出现异常的所有边界内部函数生成内存排序指令,在x86上这些指令是mfence、sfence或lfence指令,而在SPARC平台上这些指令是membar指令.
10.
4内存边界内部函数OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01104__compiler_barrier()内部函数不会生成指令,但会通知编译器所有以前的内存操作必须在启动任何后续内存操作之前完成.
所产生的实际结果为:具有static存储类说明符的所有非局部变量和局部变量都将在边界之前存储回到内存,然后在边界之后重新装入,编译器不会将边界之前的内存操作与边界之后的内存操作弄混.
所有其他的边界均隐含__compiler_barrier()内部函数的行为.
例如,在以下代码中__compiler_barrier()内部函数的存在将阻止编译器合并两种循环:#include"mbarrier.
h"intthread_start[16];voidstart_work(){/*Startallthreads*/for(inti=0;i/lib传递给ld(如果编译器安装在标准位置中).
可以使用-norunpath禁止在可执行文件中生成共享库的缺省路径.
缺省情况下,链接程序会搜索/lib和/usr/lib.
请勿在-L选项中指定这些目录或任何编译器安装目录.
对于针对部署生成的程序,应该使用-norunpath或-R选项进行生成,这样可避免在编译器目录中查找库.
请参见第115页中的"11.
6使用共享库".
11.
3相关的库选项OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0111211.
4使用类库通常,使用类库分两个步骤:1.
在源码中包括适当的头文件.
2.
将程序与目标库链接.
11.
4.
1iostream库C++编译器提供两种iostream实现:传统iostream.
该术语指的是C++4.
0、4.
0.
1、4.
1和4.
2编译器所附带的iostream库,以及基于cfront的3.
0.
1编译器附带的更早的iostream库.
没有用于此库的标准.
它在libiostream中可用.
标准iostream.
该库是C++标准库libCstd的一部分,仅在标准模式下可用.
该库与传统iostream库的二进制和源码都不兼容.
如果已有C++源,那么代码可能象以下示例一样使用传统iostream.
//fileprog1.
cc#includeintmain(){coutintmain(){std::cout库的可替换部分由一般称为"STL"的内容和字符串类、iostream类及其帮助类组成.
因为这些类和头文件是相互依赖的,所以不能仅替换其中的一部分.
如果要替换任何一部分,就应该替换所有头文件和所有libCstd.
11.
7.
2不可替换的内容标准头文件、和与编译器本身以及libCrun紧密相关,不能可靠替换.
库libCrun包含了编译器依赖且不能替换的许多"帮助"函数.
从C继承的17个标准头文件(、、等)与OracleSolaris操作系统和Solaris基本运行时库libc紧密相关,不能可靠替换.
这些头文件的C++版本(、、等)与基本C版本紧密相关,不能可靠替换.
11.
7替换C++标准库OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0111611.
7.
3安装替换库要安装替换库,必须先确定替换头文件的位置和libCstd的替换库.
为方便讨论,假定头文件放置在/opt/mycstd/include中,库放置在/opt/mycstd/lib中.
假定库称为libmyCstd.
a.
(通常,库名称以"lib"开头.
)11.
7.
4使用替换库每次编译时,都使用-I选项指向头文件的安装位置.
此外,还使用-library=no%Cstd选项防止查找编译器自身版本的libCstd头文件.
例如:example%CC-I/opt/mycstd/include-library=no%Cstd.
.
.
(compile)编译期间,-library=no%Cstd选项防止搜索编译器自身版本的这些头文件所在的目录.
每次执行程序或库链接时,都使用-library=no%Cstd选项防止查找编译器自身的libCstd,使用-L选项指向替换库所在的目录,以及使用-l选项指定替换库.
例如:example%CC-library=no%Cstd-L/opt/mycstd/lib-lmyCstd.
.
.
(link)也可以直接使用库的全路径名,而不使用-L和-l选项.
例如:example%CC-library=no%Cstd/opt/mycstd/lib/libmyCstd.
a.
.
.
(link)链接期间,-library=no%Cstd选项防止链接编译器自身版本的libCstd.
11.
7.
5标准头文件实现C有17个标准头文件(、、等).
这些头文件作为OracleSolaris操作系统的一部分提供,位于/usr/include目录中.
C++也有这些头文件,但另外要求在全局名称空间和std名称空间中都有各种声明的名称.
C++也有另一个版本的各个C标准头文件(、和等),仅名称空间std中有各种声明的名称.
最后,C++添加了32个自己的标准头文件(、、等).
标准头文件的明显实现将C++源码中找到的名称用作包括的文本文件的名称.
例如,标准头文件(或)可能指某目录中名为string(或string.
h)的文件.
这种明显实现有以下缺点:如果头文件没有文件名后缀,则无法仅搜索头文件或为头文件创建makefile规则.
如果具有名为string的目录或可执行程序,可能会错误地找到该目录或程序而不是标准头文件.
11.
7替换C++标准库第11章使用库117为了解决这些问题,编译器include目录会包含一个与头文件同名的文件和一个指向它且具有唯一后缀.
SUNWCCh(SUNW是所有编译器相关软件包的前缀,CC指C++编译器,h是常用的头文件后缀)的符号链接.
指定后,编译器将其重写为并搜索该名称.
后缀名只能在编译器自己的include目录中找到.
如果这样找到的文件是符号链接(正常情况下),编译器就对链接进行一次引用解除,并将结果(此例中是string)用作错误消息和调试器引用的文件名.
忽略文件的依赖性信息时,编译器使用带后缀的名称.
仅当出现在尖括号中且无需指定任何路径时,17种标准C头文件和32种标准C++头文件的两种格式才会发生名称重写.
如果使用引号来代替尖括号指定任何路径组件或其他某些头文件,就不会有重写发生.
下表说明了通常的情况.
表11–3头文件搜索示例源代码编译器搜索注释string.
SUNWCChC++字符串模板cstring.
SUNWCChCstring.
h的C++版本string.
h.
SUNWCChCstring.
hfcntl.
h不是标准C或C++头文件"string"string双引号,不是尖括号.
.
/string指定的路径如果编译器未找到header.
SUNWCCh,则编译器将重新搜索#include指令中提供的名称.
例如,如果使用指令#include,编译器就尝试查找名为string.
SUNWCCh的文件.
如果搜索失败,编译器就查找名为string的文件.
11.
7.
5.
1替换标准C++头文件由于第117页中的"11.
7.
5标准头文件实现"中介绍的搜索算法,您无需提供第117页中的"11.
7.
3安装替换库"中介绍的SUNWCCh版本的替换头文件.
但是,如果遇到了所描述的某些问题,建议为每个无后缀的头文件添加后缀为.
SUNWCCh的符号链接.
也就是说,对于文件utility,可以运行以下命令:example%ln-sutilityutility.
SUNWCCh编译器第一次查找utility.
SUNWCCh时,会找到它,而不会和其他名为utility的文件或目录混淆.
11.
7替换C++标准库OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0111811.
7.
5.
2替换标准C头文件不支持替换标准C头文件.
如果仍然希望提供标准头文件的自己的版本,那么建议按以下步骤操作:将所有替换头文件放置在一个目录中.
在该目录中创建指向每个替换头文件的.
SUNWCCh符号链接.
在每次调用编译器时使用-I指令,搜索包含替换头文件的目录.
例如,假设有和的替换.
请将文件stdio.
h和cstdio放在目录/myproject/myhdr中.
在该目录中,运行以下命令:example%ln-sstdio.
hstdio.
h.
SUNWCChexample%ln-scstdiocstdio.
SUNWCCh每次编译时使用-I/myproject/mydir选项.
忠告:如果要替换任何C头文件,就必须成对替换.
例如,如果替换,还应该替换.
替换头文件必须与被替换版本具有相同的效果.
也就是说,各种运行时库(如libCrun、libC、libCstd、libc和librwtool)是使用标准头文件中的定义生成的.
如果替换文件不匹配,那么程序不能工作.
11.
7替换C++标准库第11章使用库119120使用C++标准库当在缺省(标准)模式下编译时,编译器可以访问C++标准指定的整个库.
库组件包括一般称为标准模板库(StandardTemplateLibrary,STL)的库和下列组件:字符串类数字类标准流I/O类基本内存分配异常类运行时类型信息术语STL没有正式的定义,但是通常理解为包括容器、迭代器以及算法.
以下标准库头的子集可以认为包含了STL:C++标准库(libCstd)基于RogueWaveStandardC++Library,Version2.
该库是缺省库.
C++编译器还支持STLport的标准库实现版本4.
5.
3.
libCstd仍是缺省库,STLport的产品只是备选的.
有关更多信息,请参见第123页中的"12.
2STLport".
如果需要使用自己的C++标准库版本而非编译器附带的某一版本,可以通过指定-library=no%Cstd选项来实现.
替换与编译器一起发布的标准库是有风险的,不能保证产生预期的结果.
有关更多信息,请参见第116页中的"11.
7替换C++标准库".
12第12章12112.
1C++标准库头文件表12–1列出了完整标准库的头文件以及每个头文件的简要介绍.
表12–1C++标准库头文件头文件说明操作容器的标准算法位的固定大小序列数字类型表示复数支持在端点增加和删除的序列预定义异常类文件的流I/O函数对象iostream操纵符iostream基类iostream类的前向声明基本流I/O功能输入I/O流遍历序列的类数字类型的属性排序的序列国际化支持带有键/值对的关联容器专用内存分配器基本内存分配和释放通用的数字操作输出I/O流支持在头部增加和在尾部删除的序列有唯一键值的关联容器将内存中的字符串用为源或接收器的流I/O12.
1C++标准库头文件OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01122表12–1C++标准库头文件(续)头文件说明支持在头部增加和删除的序列附加的标准异常类iostream的缓冲区类字符序列运行时类型标识比较运算符用于数字编程的值数组支持随机访问的序列12.
2STLport如果要使用替换libCstd的标准库,请使用标准库的STLport实现.
可以使用以下编译器选项关闭libCstd并改用STLport库:-library=stlport4有关更多信息,请参见第188页中的"A.
2.
49-library=l[,l.
.
.
]".
本发行版包括称为libstlport.
a的静态归档文件和称为libstlport.
so的动态库.
决定是否使用STLport实现之前,请先考虑以下信息:STLport是开放源代码产品,并不能保证不同发行版本之间的兼容性.
换而言之,使用STLport的将来版本进行编译可能会破坏使用STLport4.
5.
3编译的应用程序.
它还可能无法将使用STLport4.
5.
3编译的二进制文件与使用STLport的将来版本编译的二进制文件链接在一起.
stlport4、Cstd和iostream库都提供了自己的I/O流实现.
如果使用-library选项指定其中多个库,会导致出现不确定的程序行为.
编译器的后续发行版本可能不包括STLport4,只包括更新版本的STLport.
在将来发行版中可能不能使用编译器选项-library=stlport4,但可能会用引用更高STLport版本的选项替换该选项.
Tools.
h++不支持STLport.
STLport与缺省的libCstd是二进制不兼容的.
如果使用标准库的STLport实现,则必须使用选项-library=stlport4编译和链接包括第三方库在内的所有文件.
这意味着存在一些限制,例如,不可同时使用STLport实现和C++区间数学库libCsunimath.
这是因为对libCsunimath编译时使用的是缺省的库头文件而不是STLport.
12.
2STLport第12章使用C++标准库123如果决定使用STLport实现,那么一定要包括代码隐式引用的头文件.
允许标准头文件,但不必要包括另一个标准头文件作为实现的一部分.
12.
2.
1重新分发和支持的STLport库请参见分发自述文件,了解可依照"最终用户目标代码许可协议"的条款随您的可执行文件或库重新分发的库和目标文件列表.
此自述文件的C++部分列出该编译器发行版支持的STLport.
so版本.
此自述文件位于此发行版的OracleSolarisStudio软件的法律页面上,网址为http://www.
oracle.
com/technetwork/server-storage/solarisstudio/overview/index.
html.
因为以下测试示例中的代码将库实现假定为不可移植,所以在该测试示例中不能使用STLport编译.
具体来说,它假定或自动包含,这是无效假定.
#include#includeusingnamespacestd;intmain(){vectorv1(10);vectorv3(v1.
size());for(inti=0;iv2(v1.
size());copy_backward(v1.
begin(),v1.
end(),v2.
end());ostream_iteratoriter(cout,"");copy(v2.
begin(),v2.
end(),iter);cout包含在源代码中.
12.
3Apachestdcxx标准库通过使用-library=stdcxx4进行编译,在OracleSolaris中使用Apachestdcxx版本4C++标准库代替缺省的libCstd.
此选项还会隐式设置-mt选项.
stdcxx库需要使用多线程模式.
必须在整个应用程序的每个编译和链接命令中一致使用此选项.
用-library=stdcxx4编译的代码与用缺省的-library=Cstd或可选的-library=stlport4编译的代码不能用在同一程序中.
使用Apachestdcxx库时,请牢记以下事项:stdcxx和iostream库都提供了自己的I/O流实现.
如果使用-library选项指定其中多个库,会导致出现不确定的程序行为.
12.
3Apachestdcxx标准库OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01124stdcxx不支持Tools.
h++.
stdcxx不支持C++区间数学库(libCsunimath).
stdcxx库与缺省的libCstd和STLport是二进制不兼容的.
如果使用标准库的stdcxx实现,则必须使用选项-library=stdcxx4编译和链接包括第三方库在内的所有文件.
12.
3Apachestdcxx标准库第12章使用C++标准库125126使用传统iostream库与C类似,C++没有内建输入或输出语句.
相反,I/O工具是由库提供的.
C++编译器提供了iostream类的传统实现和ISO标准实现.
缺省情况下,传统iostream类包含在libiostream中.
如果源代码使用传统iostream类,且要在标准模式下编译源代码,请使用libiostream.
如果要在标准模式下使用传统iostream功能,请将iostream.
h头文件包括进来并使用-library=iostream选项进行编译.
标准iostream类只能用于标准模式下,且包含在C++标准库libCstd中.
本章介绍了传统iostream库并提供了其使用示例,但并未完整介绍iostream库.
有关更多详细信息,请参见iostream库手册页.
要访问传统iostream手册页,请键入命令:man-s3CC4name请参见第113页中的"11.
4.
1.
1有关传统iostream和传统RogueWave工具的说明"13.
1预定义的iostream有四个预定义的iostream:cin,连接到标准输入cout,连接到标准输出cerr,连接到标准错误clog,连接到标准错误除了cerr之外,所有预定义的iostream都是完全缓冲的.
请参见第129页中的"13.
3.
1使用iostream进行输出"和第131页中的"13.
3.
2使用iostream进行输入".
13第13章12713.
2iostream交互的基本结构通过将iostream库包括进来,程序可以使用许多输入流或输出流.
每个流都具有某些源或接收器,如下所示:标准输入标准输出标准错误文件字符数组流可以被限定到输入或输出,或同时具有输入和输出.
iostream库使用两个处理层来实现这些流.
较低层实现了序列,即字符的简单流.
这些序列由streambuf类或从其派生的类实现.
较高层对序列执行格式化操作.
这些格式化操作由istream和ostream类实现,这两个类将从streambuf类派生的类型的对象作为成员.
附加类iostream用于执行输入和输出的流.
标准输入、输出和错误由从类istream或ostream派生的特殊类对象处理.
分别从istream、ostream和iostream派生的ifstream、ofstream和fstream类用于处理文件的输入和输出.
分别从istream、ostream和iostream派生的istrstream、ostrstream和strstream类用于处理字符数组的输入和输出.
打开输入或输出流时,要创建其中一种类型的对象,并将流的streambuf成员与设备或文件关联.
通常通过流构造函数执行此关联,因此不用直接使用streambuf.
iostream库为标准输入、标准输出和错误输出预定义了流对象,因此不必为这些流创建自己的对象.
可以使用运算符或iostream成员函数将数据插入流(输出)或从流(输入)提取数据,以及控制插入或提取的数据的格式.
如果要插入和提取新的数据类型(其中一个类),通常需要重载插入和提取运算符.

13.
3使用传统iostream库要使用来自传统iostream库的例程,必须针对所需的库部分将头文件包括进来.
下表对头文件进行了具体描述.
13.
2iostream交互的基本结构OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01128表13–1iostream例程头文件头文件说明iostream.
h声明iostream库的基本功能.
fstream.
h声明文件专用的iostream和streambuf.
包括了iostream.
h.
strstream.
h声明字符数组专用的iostream和streambuf.
包括了iostream.
h.
iomanip.
h声明操纵符:在iostream中插入或提取的值有不同的作用.
包括了iostream.
h.
stdiostream.
h(已过时)声明stdio文件专用的iostream和streambuf.
包括了iostream.
h.
stream.
h(已过时)包括了iostream.
h、fstream.
h、iomanip.
h和stdiostream.
h.
用于兼容C++1.
2版的旧式流.
通常程序中不需要所有这些头文件,而仅包括所需声明的头文件.
缺省情况下,libiostream包含传统的iostream库.
13.
3.
1使用iostream进行输出使用iostream进行的输出通常依赖于重载的左移运算符(#includeclassstring{private:char*data;size_tsize;public://(functionsnotrelevanthere)friendostream&operator>(istream&,string&);};在此示例中,必须将插入运算符和提取运算符定义为友元,因为string类的数据部分是private.
ostream&operator>,可以像插入操作那样将提取操作串接在一起.
例如:cin>>a>>b;13.
3使用传统iostream库第13章使用传统iostream库131该语句从标准输入获得两个值.
与其他重载的运算符一样,所使用的提取器取决于a和b的类型.
如果a和b具有不同的类型,则会使用两个不同的提取器.
ios(3CC4)手册页中详细讨论了输入格式以及如何控制输入格式.
通常,前导空白字符(空格、换行符、标签、换页等)被忽略.
13.
3.
3定义自己的提取运算符要输入新的类型时,如同重载输出的插入运算符,请重载输入的提取运算符.

类string定义了其提取运算符,如以下代码示例所示:示例13–1string提取运算符istream&operator>>(istream&istr,string&input){constintmaxline=256;charholder[maxline];istr.
get(holder,maxline,"\n');input=holder;returnistr;}get函数从输入流istr读取字符,并将其存储在holder中,直到读取了maxline-1字符、遇到新行或EOF(无论先发生哪一项).
然后,holder中的数据以空终止.
最后,holder中的字符复制到目标字符串.
按照约定,提取器转换其第一个参数中的字符(此示例中是istream&istr),将其存储在第二个参数(始终是引用),然后返回第一个参数.
因为提取器会将输入值存储在第二个参数中,所以第二个参数必须是引用.
13.
3.
4使用char*提取器使用该预定义提取器时,请务必小心,它可能会导致问题.
请按如下方式使用该提取器:charx[50];cin>>x;该提取器跳过前导空白,提取字符并将其复制到x中,直至遇到另一个空白字符.
然后,它使用终止空(0)字符完成字符串.
请谨慎使用该提取器,因为输入可能会溢出给定的数组.
您还必须确保指针指向了分配的存储.
以下示例显示了一个常见错误:char*p;//notinitializedcin>>p;13.
3使用传统iostream库OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01132由于将存储输入数据的位置不确定,因此您的程序可能会中止.
13.
3.
5读取任何单一字符除了使用char提取器外,还可以使用任一形式的get成员函数获取一个字符.
例如:charc;cin.
get(c);//leavescunchangedifinputfailsintb;b=cin.
get();//setsbtoEOFifinputfails注–与其他提取器不同,char提取器不会跳过前导空白.
以下示例显示了一种方法,该方法只跳过空格并在制表符、换行符或任何其他字符处停止:inta;do{a=cin.
get();}while(a=='');13.
3.
6二进制输入如果需要读取二进制值(如使用成员函数write写入的值),可以使用read成员函数.
以下示例说明了如何使用read成员函数输入原始二进制形式的x,这是先前使用write的示例的反向操作.
cin.
read((char*)&x,sizeof(x));13.
3.
7查看输入可以使用peek成员函数查看流中的下一个字符,而不必提取该字符.
例如:if(cin.
peek()!
=c)return0;13.
3.
8提取空白缺省情况下,iostream提取器跳过前导空白.
以下示例先关闭了cin跳过空白功能,然后将其打开:13.
3使用传统iostream库第13章使用传统iostream库133cin.
unsetf(ios::skipws);//turnoffwhitespaceskipping.
.
.
cin.
setf(ios::skipws);//turnitonagain可以使用iostream操纵符ws从iostream中删除前导空白,不论是否启用了跳过功能.
以下示例说明了如何从iostreamistr中删除前导空白:istr>>ws;13.
3.
9处理输入错误按照约定,第一个参数为非零错误状态的提取器不能从输入流提取任何数据,且不能清除任何错误位.
失败的提取器至少应该设置一个错误位.
对于输出错误,您应该定期检查错误状态,并在发现非零状态时采取某些操作(诸如终止).
!
运算符测试iostream的状态.
例如,如果输入字母字符用于输入,以下代码就会产生输入错误:#include#includevoiderror(constchar*message){cerr>bad;if(!
cin)error("abortedduetoinputerror");cout>dec以10为基数进行整数转换.
2ostr>hex以16为基数进行整数转换.
6ostr>oct以8为基数进行整数转换.
7istr>>ws提取空白字符(跳过空白),直至找到非空白字符(留在istr中).
8ostr>setbase(n)将转换基数设置为n(仅限0、8、10、16).
9ostr>setw(n)调用ios::width(n).
将字段宽度设置为n.
10ostr>resetiosflags(i)根据i中设置的位,清除标志位向量.
13.
6格式控制OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01138表13–2iostream的预定义操纵符(续)预定义的操纵符说明11ostr>setiosflags(i)根据i中设置的位,设置标志位向量.
12ostr>setfill(c)将填充字符(用来填充字段)设置为c.
13ostr>setprecision(n)将浮点精度设置为n位数.
要使用预定义的操纵符,必须在程序中包含文件iomanip.
h.
您可以定义自己的操纵符.
操纵符的两个基本类型为:无格式操纵符-采用istream&、ostream&或ios&参数,对流进行操作,然后返回其参数.
参数化操纵符-采用istream&、ostream&或ios&参数以及一个附加参数,对流进行操作,然后返回其流参数.
13.
7.
1使用无格式操纵符无格式操纵符是执行以下操作的一个函数:执行到流的引用以某种方式操作流返回其参数由于为iostream预定义了接受指向此类函数的指针的移位运算符,因此可以在输入或输出运算符序列中放入函数.
移位运算符会调用函数而不是尝试读取或写入值.
以下示例显示了将tab插入ostream的tab操纵符:ostream&tab(ostream&os){returnos#includeistream&skipon(istream&is){is.
setf(ios::skipws,ios::skipws);returnis;}istream&skipoff(istream&is){is.
unsetf(ios::skipws);returnis;}.
.
.
intmain(){intx,y;cin>>skipon>>x>>skipoff>>y;return1;}13.
7.
2参数化操纵符iomanip.
h中包含的其中一个参数化操纵符是setfill.
setfill设置用于填写字段宽度的字符.
该操纵符是按下例所示的方式实现的://filesetfill.
cc#include#include//theprivatemanipulatorstaticios&sfill(ios&i,intf){i.
fill(f);returni;}//thepublicapplicatorsmanip_intsetfill(intf){returnsmanip_int(sfill,f);}参数化操纵符的实现分为两部分:操纵符.
它使用一个额外的参数.
在上面的代码示例中,采用了额外的int参数.
由于未对这个操纵符函数定义移位运算符,所以您无法将它放至输入或输出操作序列中.
相反,您必须使用辅助函数applicator.
applicator.
它调用该操纵符.
applicator是全局函数,您会为它生成在头文件中可用的原型.
通常操纵符是文件中的静态函数,该文件包含了applicator的源代码.
该操纵符仅由applicator调用.
如果将其指定为静态的,您需要确保它的名称不在全局地址空间中.
头文件iomanip.
h中定义了多个类.
每个类都保存一个操纵符函数的地址和一个参数的值.
manip(3CC4)手册页中介绍了iomanip类.
上一示例使用了smanip_int类,该类可与ios一起使用.
因为该类与ios一起使用,所以也可以与istream和ostream一起使用.
上面的示例还使用了另一个类型为int的参数.
13.
7操纵符OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01140applicator创建并返回类对象.
在上面的代码示例中,类对象是smanip_int,其中包含了操纵符和applicator的int参数.
iomanip.
h头文件定义了用于该类的移位运算符.
如果applicator函数setfill在输入或输出操作序列中,会调用该applicator函数,且其返回一个类.
移位运算符作用于该类,以使用其参数值(存储在类中)调用操纵符函数.
在以下示例中,操纵符print_hex执行以下操作:将输出流设置成十六进制模式将long值插入流中恢复流的转换模式此处使用了类omanip_long,因为该代码示例仅用于输出.
它对long而不是对int进行操作:#include#includestaticostream&xfield(ostream&os,longv){longsave=os.
setf(ios::hex,ios::basefield);os>toFile.
rdbuf();然后源文件被提取到目标中.
两种方法是完全等同的.
13.
10处理streambuf流OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0114213.
11iostream手册页许多C++手册页都介绍了iostream库的详细信息.
下表概述了每个手册页中的内容.
要访问传统iostream库手册页,请键入:example%man-s3CC4name表13–3iostream手册页概述手册页概述filebuf详细介绍了从streambuf派生并专用于文件的类filebuf的公用接口.
有关从类streambuf继承的功能的详细信息,请参见sbufpub(3CC4)和sbufprot(3CC4)手册页.
可通过类fstream使用filebuf类.
fstream详细介绍了类ifstream、ofstream和fstream的专用成员函数,这些类是用于文件的istream、ostream和iostream专用版本.
ios详细介绍了作为iostream的基类的类ios的各个部分.
该类也包含了所有流公共的状态数据.
ios.
intro简要介绍了iostream.
istream详细说明了以下内容:类istream的成员函数,这些函数支持对从streambuf获取的字符进行解释输入格式化归为类ostream的一部分的定位函数某些相关函数相关操纵符manip介绍了iostream库中定义的输入和输出操纵符.
ostream详细说明了以下内容:类ostream的成员函数,这些函数支持对写入streambuf的字符进行解释输出格式化归为类ostream的一部分的定位函数某些相关函数相关操纵符sbufprot介绍了对从类streambuf派生的类进行编码的程序员所需的接口.
有关sbufprot(3CC4)手册页中未讨论的一些公用函数,另请参见sbufpub(3CC4)手册页.
13.
11iostream手册页第13章使用传统iostream库143表13–3iostream手册页概述(续)手册页概述sbufpub详细介绍了streambuf类的公用接口,尤其是streambuf的公用成员函数.
该手册页包含了直接处理streambuf类型的对象所需的信息,或是查找从streambuf派生的类从其继承的函数所需的信息.
如果要从streambuf派生类,另请参见sbufprot(3CC4)手册页.
ssbuf详细介绍了从streambuf派生并专用于处理字符数组的类strstreambuf的专用公用接口.
有关从类streambuf继承的功能的详细信息,请参见sbufpub(3CC4)手册页.
stdiobuf包含类stdiobuf的简要描述,该类是从streambuf中派生的并专用于处理stdioFILE.
有关从类streambuf继承的功能的详细信息,请参见sbufpub(3CC4)手册页.
strstream详细介绍了由从iostream派生并专用于处理字符数组的一组类实现的strstream的专用成员函数.
13.
12iostream术语iostream库说明中常常使用一些与一般编程中的术语类似的术语,但有特殊含义.
下表阐明了在讨论iostream库时使用的这些术语的定义.
表13–4iostream术语iostream术语定义缓冲区该词有两个含义,一个特定于iostream软件包,另一个较常适用于输入和输出.
与iostream库特定相关时,缓冲区是由类streambuf定义的类型的对象.
通常,缓冲区是一个内存块,用于将字符高效传输到输出的输入.
对于已缓冲的I/O,缓冲区已满或被强制刷新之前,字符的实际传输会延迟.
无缓冲的缓冲区是指在其中没有上文定义的通用意义的缓冲区的streambuf.
本章避免了使用术语缓冲区来指代streambuf.
但是,手册页和其他C++文档确实使用术语缓冲区来指代streambuf.
提取从iostream获取输入的过程.
Fstream专用于文件的输入或输出流.
以monospace字体输出时,特指从类iostream派生的类.
插入将输出发送到iostream中的过程.
iostream通常为输入或输出流.
13.
12iostream术语OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01144表13–4iostream术语(续)iostream术语定义iostream库表示通过include文件iostream.
h、fstream.
h、strstream.
h、iomanip.
h和stdiostream.
h实现的库.
因为iostream是面向对象的库,所以应扩展该库.
流通常是指iostream、fstream、strstream或用户定义的流.
streambuf包含字符序列的缓冲区,其中字符具有put或get指针(或兼有).
以monospace字体输出时,它表示特定类.
否则,通常是指streambuf类或从streambuf派生的类的对象.
任何流对象都包含从streambuf派生的类型的对象或指向对象的指针.
strstream专用于字符数组的iostream.
以monospace字体输出时,它表示特定类.
13.
12iostream术语第13章使用传统iostream库145146生成库本章解释了如何生成您自己的库.
14.
1了解库库具有两点好处.
首先,它们提供了在多个应用程序间共享代码的方法.
如果您有要共享的代码,则可以创建一个具有该代码的库,并将该库链接到需要这些代码的应用程序.
其次,库提供了降低大型应用程序复杂性的方法.
这类应用程序可以将相对独立的部分生成为库并进行维护,因此减轻程序员在其他部分工作的负担.

生成库只不过是创建.
o文件(使用-c选项编译代码)并使用CC命令将.
o文件并入库中.
可以生成两种库:静态(归档)库和动态(共享)库.
对于静态(归档)库,库中的对象在链接时链接到程序的可执行文件中.
只有库中属于应用程序所需的那些.
o文件链接到可执行文件.
静态(归档)库名称通常以.
a后缀结尾.
对于动态(共享)库,库中的对象并不链接到程序的可执行文件,而是由链接程序在可执行文件中注明程序依赖于该库.
执行该程序时,系统会装入程序所需的动态库.
如果使用同一动态库的两个程序同时执行,那么操作系统在程序间共享这个动态库.
动态(共享)库的名称以.
so后缀结尾.
动态链接共享库较静态链接归档库有多个优势:可执行文件较小.
在运行时,代码的有效部分可在程序间共享,这样就可以降低内存使用量.

库可以在运行时替换,无需重新链接应用程序.
(这是用于使程序能够利用OracleSolaris操作系统中的多项改进的主要机制,有了此机制,无需重新链接和分发程序.
)共享库可以在运行时通过使用dlopen()函数调用来装入.
但动态库也具有一些缺点:14第14章147运行时链接有执行时间成本.
使用动态库进行程序的分发可能会要求同时分发该程序所使用的库.
将共享库移动到一个不同的位置就可以阻止系统查找该库并执行程序.
(环境变量LD_LIBRARY_PATH可以帮助克服此问题.
)14.
2生成静态(归档)库生成静态(归档)库的机制与生成可执行文件相似.
可以使用CC的-xar选项将一组目标(.
o)文件组合到单个库中.
可以使用CC-xar而非直接使用ar命令来生成静态(归档)库.
C++语言通常要求编译器维护的信息比传统.
o文件提供的信息多,尤其是模板实例.
–xar选项可确保所有必要信息(包括模板实例)都包括在库中.
在常规编程环境下,可能无法完成该操作,因为make可能无法确定实际创建和引用了哪些模板文件.
如果没有CC-xar,所引用的模板实例可能不能根据需要包括在库中.
例如:%CC-cfoo.
cc#Compilemainfile,templatesobjectsarecreated.
%CC-xar-ofoo.
afoo.
o#Gatherallobjectsintoalibrary.
–xar标志会使CC创建静态(归档)库.
要为新建的库命名,需要使用–o指令.
编译器检查命令行上的目标文件,交叉引用这些目标文件与模板系统信息库中的目标文件,并将用户的目标文件所需的模板(以及主目标文件本身)添加到归档文件中.

注–仅可将-xar标志用于创建或更新现有归档文件.
不要用它来维护归档.
-xar选项与ar-cr等效.
在每个.
o文件中只放置一个函数.
如果您链接了某个归档文件,则在需要该归档文件中特定.
o文件中的符号时,该.
o文件将整个链接到应用程序中.
当每个.
o文件中只放置一个函数时,将只会从归档文件中链接应用程序所需的那些符号.
14.
3生成动态(共享)库动态(共享)库的生成方式与静态(归档)库的生成方式基本相同,不过,您要在命令行上使用-G而不是-xar.
不应直接使用ld.
与静态库一样,CC命令可以确保使用模板时,模板系统信息库中所有必要的模板实例都包括在库中.
在执行main()之前会调用与应用程序链接的动态库中所有静态构造函数,在main()退出之后会调用所有静态析构函数.
如果使用dlopen()打开共享库,所有静态构造函数都在执行dlopen()时执行,所有静态析构函数都在执行dlclose()时执行.
应该使用CC-G来生成动态库.
使用ld(链接编辑器)或cc(C编译器)生成动态库时,异常可能无法生效,且库中定义的全局变量未初始化.
14.
2生成静态(归档)库OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01148要生成动态(共享)库,必须使用CC的–Kpic或–KPIC选项编译每个对象来创建可重定位的目标文件.
然后您就可以生成一个具有这些可重定位目标文件的动态库.
如果遇到异常的链接故障,则可能是您忘记了使用–Kpic或–KPIC编译某些对象.
要生成名为libfoo.
so的C++动态库(该库包含源文件lsrc1.
cc和lsrc2.
cc中的对象),请键入:%CC-G-olibfoo.
so-hlibfoo.
so-Kpiclsrc1.
cclsrc2.
cc-G选项指定动态库的构造.
-o选项指定库的文件名.
-h选项指定共享库的内部名称.
-Kpic选项指定目标文件与位置无关.
CC-G命令不会将任何-l选项传递给链接程序ld.
为了确保正确的初始化顺序,共享库对其所需的每个其他共享库必须具有显式的依赖性.
要创建依赖性,请对每个此类库使用-l选项.
典型的C++共享库将使用以下几组选项之一:-lCstd-lCrun-lc-library=stlport4-lCrun-lc为了确保列出了需要的所有依赖性,请使用-zdefs选项生成库.
对于缺少的每个符号定义,链接程序都会发出错误消息.
要提供缺少的定义,请针对这些库添加-l选项.
要确定是否包含了不需要的依赖性,请使用以下命令ldd-u-rmylib.
soldd-U-rmylib.
so然后可以重新生成没有不需要的依赖性的mylib.
so.
14.
4生成包含异常的共享库切勿对包含C++代码的程序使用-Bsymbolic.
应该改用链接程序映射文件.
如果使用-Bsymbolic,不同模块中的引用会绑定到应是一个全局对象内容的不同副本.

异常机制依赖对地址的比较.
如果您具有某个对象的两个副本,它们的地址就不等同且异常机制可能失败,这是因为异常机制依赖于对假设为唯一地址的内容的比较.

14.
5生成专用的库在组织生成一个仅供内部使用的库时,可以使用不建议在一般情况下使用的选项来生成这个库.
具体来说,库不需要符合系统的应用程序二进制接口(applicationbinaryinterface,ABI).
例如,可以使用-fast选项编译库,以提高其在某已知体系结构上的性能.
同样,可以使用-xregs=float选项编译库以提高性能.
14.
5生成专用的库第14章生成库14914.
6生成公用的库在组织生成一个供其他公司使用的库时,库的管理、平台的一般性以及其他问题就变得尤为重要.
用于检验库是否为公用库的一个简单测试就是询问应用程序程序员是否可以轻松地重新编译该库.
生成公用库时应该符合系统的应用程序二进制接口(applicationbinaryinterface,ABI).
通常,这意味着应该避免任何特定于处理器的选项.
(例如,不要使用-fast或-xtarget.
)SPARCABI为应用程序保留了一些专用寄存器.
对于SPARCV7和V8,这些寄存器是%g2、%g3和%g4.
对于SPARCV9,这些寄存器是%g2和%g3.
由于大多数编译是针对应用程序的,所以在缺省情况下,为了提高程序的性能,C++编译器使用这些寄存器作为临时寄存器.
但是,对公用库中寄存器的使用通常不兼容于SPARCABI.
生成公用库时,请使用-xregs=no%appl选项编译所有对象,以确保不会使用应用程序寄存器.
14.
7生成具有CAPI的库如果要生成以C++编写但可用于C程序的库,必须创建CAPI(applicationprogramminginterface,应用程序编程接口).
为此,应先使所有导出的函数为extern"C".
注意,只有在全局函数中才能够完成该操作,在成员函数中不行.
如果C接口库需要C++运行时支持,且要使用cc进行链接,则在使用C接口库时,您还必须将您的应用程序与libCrun进行链接(标准模式).
(如果C接口库不需要C++运行时支持,则不必与libCrun进行链接.
)归档库与共享库的链接步骤是不同的.
提供归档的C接口库时,必须提供如何使用该库的说明.
如果C接口库是在标准模式(缺省模式)下使用CC生成的,那么在使用该C接口库时,将-lCrun添加到cc命令行.
如果C接口库是在兼容模式(-compat=4)下使用CC生成的,则在使用C接口库时,请将-lC添加到cc命令行.
提供共享的C接口库时,必须在生成库时创建对libCrun的依赖性.
如果共享库具有正确的依赖性,则在使用该库时不需要将-lCrun添加到命令.
如果要在缺省标准模式下生成C接口库,则在生成该库时应该将-lCrun添加到CC命令.
如果要删除对C++运行时库的任何依赖性,应该在库源文件中强制应用下列代码规则:不要使用任何形式的new或delete,除非提供了自己的相应版本.
不要使用异常.
不要使用运行时类型信息(RTTI).
14.
6生成公用的库OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-0115014.
8使用dlopen从C程序访问C++库如果要使用dlopen()从C程序打开C++共享库,应确保共享库依赖于适当的C++运行时(对于-compat=5,为libCrun.
so.
1).
为此,对于-compat=5,在生成共享库时,应将-lCrun添加到命令行.
例如:example%CC-G-compat=5.
.
.
-lCrun如果共享库使用了异常且不具有对C++运行库的依赖性,则C程序可能会出现无规律的行为.
14.
8使用dlopen从C程序访问C++库第14章生成库151152附录第4部分153154C++编译器选项本附录详细介绍了C++编译器的命令行选项.
所介绍的功能适用于所有平台(特别注明的除外);特定于SPARC系统的OracleSolarisOS功能用SPARC标识,特定于x86系统的OracleSolaris和LinuxOS功能用x86标识.
仅限于OracleSolarisOS的功能用Solaris标记;仅限于LinuxOS的功能用Linux标记.
本手册的此部分使用前言中列出的印刷约定来说明各个选项.
圆括号、大括号、方括号、"|"或"-"字符以及省略号是选项描述中使用的元字符,而不是选项自身的一部分.
A.
1选项信息的结构为了帮助您查找信息,编译器选项描述被分为以下几个子节.
如果一个选项被其他选项取代或与其他选项一致,就请参见其他选项的说明以获取完整的详细信息.

表A–1选项子节子节内容选项定义紧跟在每个选项之后的简短定义.
(该类无标题.
)值如果选项具有一个或多个值,则本节将定义每个值.
缺省值如果选项具有主缺省值或辅助缺省值,则在此处进行声明.
如果未指定选项,则主缺省值为有效选项值.
例如,如果未指定–compat,则缺省值为–compat=5.
如果指定了选项但不给定任何值,则辅助缺省值为有效选项值.
例如,如果指定了–compat但未提供值,则缺省值为-compat=5.
扩展如果选项具有宏扩展,则将在本节中显示.
A附录A155表A–1选项子节(续)子节内容示例如果要举例说明选项,则在此处给出所需示例.
交互如果选项与其他选项进行交互,则在此处讨论它们的关系.
警告此处将注明与选项使用相关的警告(例如可能会产生意外行为的操作).
另请参见本节包含到其他选项或文档中更多信息的引用.
"替换为"、"与.
.
.
相同"如果选项已废弃且已被其他选项替换,则在此处说明替换的选项.
以后的发行版本可能不支持以这种方式描述的选项.
如果有两个选项具有相同的含义和用途,则在此处引用首选项.
例如,"与-xO相同"表示-xO是首选项.
A.
2选项参考本节按字母顺序列出所有的C++编译器选项,并指出所有的平台限制.
A.
2.
1-#打开详细模式,显示命令选项的扩展方式.
显示调用的每个组件.
A.
2.
2-###按照调用每个组件时的方式显示该组件,但不实际执行该组件.
还显示命令选项扩展的过程.
A.
2.
3–Bbinding指定链接的库绑定是symbolic、dynamic(共享)还是static(非共享).
可以在命令行上多次使用–B选项.
该选项传递给链接程序ld.
注–在OracleSolaris64位编译环境中,许多系统库只能用作动态库.
因此,请勿在命令行上将-Bstatic用作最后一个切换开关.
A.
2.
3.
1值binding必须是下表中列出的值之一:A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01156值含义dynamic指示链接编辑器查找liblib.
so(共享)文件,如果未找到这些文件,则查找liblib.
a(静态非共享)文件.
当链接需要共享库绑定时,请使用该选项.
static指示链接编辑器只查找liblib.
a(静态非共享)文件.
当链接需要非共享库绑定时,请使用该选项.
symbolic如果可能,则强制在共享库中解析符号(即使符号已经在别处定义).
请参见ld(1)手册页.
(–B和binding值之间不能有空格.
)缺省值如果没有指定-B,则使用–Bdynamic.
交互要静态链接C++缺省库,请使用–staticlib选项.
-Bstatic和-Bdynamic选项会影响缺省情况下提供的库的链接.
为了确保动态链接缺省库,最后使用的–B应该是–Bdynamic.
在64位环境中,许多系统库只能用作共享动态库.
其中包括libm.
so和libc.
so(不提供libm.
a和libc.
a).
因此,在64位OracleSolaris操作系统环境中,-Bstatic和-dn可能会导致产生链接错误.
这些情况下应用程序必须与动态库链接.
示例以下编译器命令链接libfoo.
a,即使libfoo.
so存在也是如此,所有其他库都是动态链接的:example%CCa.
o–Bstatic–lfoo–Bdynamic警告对于包含C++代码的程序,切勿使用-Bsymbolic,而应使用链接程序映射文件.
如果使用-Bsymbolic,不同模块中的引用会绑定到应是一个全局对象内容的不同副本.
异常机制依赖对地址的比较.
如果您具有某项内容的两个副本,它们的地址就不等同且异常机制可能失败,这是由于异常机制依赖对假设为唯一地址内容的比较.

如果在不同的步骤中进行编译和链接,并要使用-Bbinding选项,就必须在链接步骤中包括该选项.
A.
2选项参考附录AC++编译器选项157另请参见–nolib、–staticlib、ld(1)手册页以及第114页中的"11.
5静态链接标准库"和《链接程序和库指南》A.
2.
4–c仅编译;生成.
o目标文件,但抑制链接.
该选项指示CC驱动程序抑制通过ld进行链接,并为每个源文件生成一个.
o文件.
如果只在命令行上指定一个源文件,就可以用-o选项显式指定目标文件.
A.
2.
4.
1示例如果输入CC-cx.
cc,则会生成x.
o目标文件.
如果输入CC-cx.
cc-oy.
o,则会生成y.
o目标文件.
警告当编译器为输入文件(.
c、.
i)生成目标代码时,编译器总是在工作目录下生成.
o文件.
如果抑制链接步骤,则不会删除.
o文件.
另请参见–ofilename和–xeA.
2.
5–cg{89|92}(SPARC)已废弃,请勿使用此选项.
当前的OracleSolaris操作系统软件不再支持SPARCV7体系结构.
使用此选项编译生成的代码在当前的SPARC平台中运行较慢.
应改用-xO,并利用-xarch、-xchip和-xcache编译器缺省值.
A.
2.
6–compat={5|g}设置编译器的主要发行版兼容模式.
该选项控制__SUNPRO_CC_COMPAT预处理程序宏.
C++编译器有两种主要模式.
-compat=5(缺省模式)接受符合2003年更新的ANSI/ISO1998C++标准的构造,并且在-compat=5模式下将生成与C++5.
0到5.
12兼容的代码.
在OracleSolarisx86和Linux平台上,-compat=g选项可以添加与gcc/g++编译器的源和二进制兼容性.
由于在名称改编、类布局、虚拟表布局和其他ABI详细信息方面有不兼容的重大更改,因此这些模式互不兼容.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01158在以前发行版中接受由4.
2编译器定义的语义和语言的兼容性模式(-compat=4)不再可用.
这些模式由–compat选项进行区分,如以下部分中所示.
A.
2.
6.
1值-compat选项可以使用下表中显示的值.
值含义–compat=5(标准模式)设置语言和二进制使其与ANSI/ISO标准模式兼容.
将__SUNPRO_CC_COMPAT预处理程序宏设置为5.
-compat=g(仅限x86)启用对g++语言扩展的识别,并使编译器在Solaris和Linux平台上生成与g++二进制兼容的代码.
将__SUNPRO_CC_COMPAT预处理程序宏设置为'G'.
使用-compat=g时,二进制兼容性仅扩展到共享(动态或.
so)库,而不扩展到个别.
o文件或归档(.
a)库.
以下示例显示了将g++共享库链接到C++主程序的过程:%g++-shared-olibfoo.
so-fpica.
ccb.
ccc.
cc%CC-compat=gmain.
cc-L.
-lfoo以下示例显示了将C++共享库链接到g++主程序的过程:%CC-compat=g-G-olibfoo.
so-Kpica.
ccb.
ccc.
cc%g++main.
cc-L.
-lfoo缺省值如果没有指定–compat选项,则假定–compat=5.
交互有关更多信息,请参见—features.
警告生成共享库时,不要使用-Bsymbolic.
A.
2.
7+d请勿扩展C++内联函数.
A.
2选项参考附录AC++编译器选项159按照C++语言规则,C++内联函数是指具有以下特征的函数,对于该函数以下陈述之一为真:该函数的定义中使用了关键字inline该函数在类定义内部定义(不仅是声明)该函数是编译器生成的类成员函数按照C++语言规则,编译器可以选择是否将调用实际内联到内联函数.
C++编译器将调用内联到内联函数,除非下述事项之一为真:函数太复杂已选定+d选项已选定-g选项,但未指定-xOn优化级别A.
2.
7.
1示例缺省情况下,编译器可以内联以下代码示例中的函数f()和memf2().
此外,该类具有编译器可以内联的由编译器生成的缺省构造函数和析构函数.
使用+d时,编译器不会内联f()和C::mf2()(即构造函数和析构函数).
inlineintf(){return0;}//maybeinlinedclassC{intmf1();//notinlinedunlessinlinedefinitioncomeslaterintmf2(){return0;}//maybeinlined};交互指定了调试选项–g时将自动启用此选项,除非还指定了优化级别(—O或—xO).
但指定调试选项–g0不会启用+d.
+d选项对使用-xO4或-xO5时执行的自动内联没有影响.
另请参见–g0和–gA.
2.
8-Dname[=def]为预处理程序定义宏符号name.
使用该选项与在源文件开头包含#define指令等效.
可以使用多个-D选项.
有关编译器预定义宏的列表,请参见CC(1)手册页.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01160A.
2.
9–d{y|n}允许或不允许将动态库用于整个可执行文件.
该选项传递给ld.
该选项只能在命令行出现一次.
A.
2.
9.
1值值含义-dy在链接编辑器中指定动态链接.
–dn在链接编辑器中指定静态链接.
缺省值如果没有指定-d选项,则使用–dy.
交互在64位环境中,许多系统库只能用作共享动态库.
其中包括libm.
so和libc.
so(不提供libm.
a和libc.
a).
因此,在64位OracleSolaris操作系统中,-Bstatic和-dn可能会导致产生链接错误.
这些情况下应用程序必须与动态库链接.
警告如果将此选项与动态库结合使用,将导致致命错误.
大多数系统库仅作为动态库可用.
另请参见ld(1)手册页和《链接程序和库指南》A.
2.
10–dalign(SPARC)已过时,不要使用.
请使用-xmemalign=8s.
有关更多信息,请参见第245页中的"A.
2.
145-xmemalign=ab".
在x86平台上会在无提示的情况下忽略此选项.
A.
2选项参考附录AC++编译器选项161A.
2.
11–dryrun显示但不编译驱动程序所生成的子命令.
该选项指示驱动程序CC显示但不执行编译驱动程序构造的子命令.
A.
2.
12–E对源文件运行预处理程序,但不进行编译.
指示CC驱动程序仅对C++源文件运行预处理程序,并将结果发送到stdout(标准输出).
此时,不进行编译,且不生成.
o文件.
此选项会导致输出中包含预处理程序类型的行号信息.
要在源代码涉及模板时编译-E选项的输出,可能需要将-template=no%extdef选项与-E选项一起使用.
如果应用程序代码使用"独立定义"模板源代码模型,使用这两个选项可能仍然无法编译-E选项的输出.
有关更多信息,请参考有关模板的章节.
A.
2.
12.
1示例该选项用于确定预处理程序所进行的更改.
例如,以下程序foo.
cc会生成第162页中的"A.
2.
12.
1示例"中所示的输出.
示例A–1预处理程序示例foo.
cc#if__cplusplusintpower(int,int);#endifintmain(){intx;x=power(2,10);}.
示例A–2使用-E选项时foo.
cc的预处理程序输出example%CC-Efoo.
cc#4"foo.
cc"templateintpower(int,int);intmain(){intx;x=power(2,10);}A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01162警告如果代码包含采用"独立定义"模型的模板,此选项的输出可能不能用作C++编译的输入.
另请参见–PA.
2.
13-erroff[=t]此命令会抑制C++编译器警告消息,但对错误消息没有影响.
此选项适用于所有警告消息,无论这些警告消息是否已被-errwarn指定为导致非零退出状态.
A.
2.
13.
1值t是一个以逗号分隔的列表,它包含以下项中的一项或多项:tag、no%tag、%all、%none.
顺序是很重要的;例如%all,no%tag抑制除tag以外的所有警告消息.
下表列出了-erroff值.
表A–2-erroff值值含义tag抑制由该tag指定的警告消息.
可通过-errtags=yes选项来显示消息的标记.
no%tag启用由该tag指定的警告消息.
%all禁止所有警告消息.
%none启用所有警告消息(缺省).
缺省值缺省值为-erroff=%none.
指定-erroff与指定-erroff=%all等效.
示例例如,-erroff=tag将抑制由该标记指定的警告消息.
另外,-erroff=%all,no%tag抑制所有警告信息,由tag标识的消息除外.
可以使用-errtags=yes选项显示警告消息的标记.
警告使用-erroff选项只能抑制来自C++编译器前端且在使用-errtags选项时显示标记的警告消息.
A.
2选项参考附录AC++编译器选项163另请参见-errtags和-errwarnA.
2.
14-errtags[=a]显示来自C++编译器前端且可以使用-erroff选项抑制或使用-errwarn选项使其成为致命警告的每个警告消息的消息标记.
A.
2.
14.
1值和缺省值a可以是yes或no.
缺省值为-errtags=no.
指定-errtags与指定-errtags=yes等效.
警告来自C++编译器驱动程序的消息以及编译系统的其他组件不包含错误标记.
因此,无法使用-erroff抑制这些消息或组件,也无法使用-errwarn将这些消息和组件标记为致命错误.
另请参见-erroff和-errwarnA.
2.
15-errwarn[=t]使用-errwarn会导致C++编译器在出现给定的警告消息时以失败状态退出.
A.
2.
15.
1值t是一个以逗号分隔的列表,它包含以下项中的一项或多项:tag、no%tag、%all、%none.
顺序很重要,例如如果出现除tag之外的任何警告,%all,no%tag会使cc以致命状态退出.
下表详细列出了-errwarn值.
表A–3-errwarn值值含义tag如果该tag指定的消息以警告消息的形式出现,就会使CC以致命状态退出.
如果未出现tag,则没有影响.
no%tag防止CC在由tag指定的消息只以警告消息形式出现时以致命状态退出.
如果未发出tag指定的消息,则不会产生任何影响.
为了避免在发出警告消息时导致cc以致命状态退出,可使用该选项来还原以前用该选项和tag或%all指定的警告消息.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01164表A–3-errwarn值(续)值含义%all使CC在出现任何警告消息时以致命状态退出.
%all可以后跟no%tag,以避免该行为的特定警告消息.
%none防止CC在出现任何警告消息时以致命状态退出.
缺省值缺省值为-errwarn=%none.
单独指定-errwarn与-errwarn=%all等效.
警告使用-errwarn选项只能对来自C++编译器前端且在使用了-errtags选项时会显示标记的警告消息进行指定,从而使编译器以失败状态退出.
由于编译器错误检查的改善和功能的增加,C++编译器生成的警告消息也会因发行版本而异.
使用-errwarn=%all进行编译而不会产生错误的代码,在编译器下一个发行版本中编译时也可能出现错误.
另请参见-erroff、-errtags和-xweA.
2.
16–fast此选项是一个宏,可以有效地用作优化可执行文件的起点,从而获得最佳运行时性能.
-fast是一个宏,随编译器发行版本的升级而变化,并扩展为目标平台特定的多个选项.
可使用-dryrun或-xdryrun选项检查-fast的扩展,并将-fast的相应选项结合到正在进行的可执行文件调优过程中.
该选项是一个宏,选择编译选项的组合用于在编译代码的机器上优化执行速度.

A.
2.
16.
1扩展该选项通过扩展到以下编译选项,为大量应用程序提供了几乎最高的性能.

表A–4-fast扩展选项SPARCx86–fnsXX–fsimple=2XX–nofstore-XA.
2选项参考附录AC++编译器选项165表A–4-fast扩展(续)选项SPARCx86-xbuiltin=%allXX–xlibmilXX–xlibmoptXX–xmemalignX-–xO5XX—xregs=frameptr-X–xtarget=nativeXX交互-fast宏可扩展为可能影响其他指定选项的编译选项.
例如,在以下命令中,-fast宏的扩展包括了将-xarch还原为某个32位体系结构选项的-xtarget=native.
错误:example%CC-xarch=sparcvis2-fasttest.
cc正确:example%CC-fast-xarch=sparcvis2test.
cc查看每个选项的描述以确定可能的交互操作.
代码生成选项、优化级别、内建函数的优化和内联模板文件的使用可以用后续选项来覆盖(请参见示例).
指定的优化级别将覆盖以前所设置的优化级别.
–fast选项包括–fns–ftrap=%none,即该选项禁用所有陷阱操作.
在x86上,-fast选项包括-xregs=frameptr.
有关详细信息,特别是编译混合C、Fortran和C++源代码时,请参见该选项的介绍.
示例执行以下编译器命令,优化级别将为–xO3.
example%CC–fast–xO3执行以下编译器命令,优化级别将为–xO5.
example%CC-xO3–fastA.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01166警告如果在不同的步骤中进行编译和链接,则编译命令和链接命令中都必须有-fast选项.
使用-fast选项编译的目标二进制文件不可移植.
例如,在UltraSPARCIII系统中用以下命令生成的二进制文件在UltraSPARCII系统中无法执行.
example%CC-fasttest.
cc不要对依赖于IEEE标准浮点运算的程序使用此选项.
可能会出现不同的数值结果、程序过早终止或出现意外的SIGFPE信号.
-fast的扩展包括-D_MATHERR_ERRNO_DONTCARE.
使用-fast,编译器可以用不设置errno变量的等效优化代码自由替换对浮点函数的调用.
并且,-fast还可以定义宏__MATHERR_ERRNO_DONTCARE,该宏允许编译器不再确保errno和在浮点函数调用后引发的浮点异常的有效性.
因此,依赖于errno的值或者浮点函数调用之后引起的正确浮点异常的用户代码会产生不一致的结果.

解决此问题的一种方法是避免使用-fast编译此类代码.
但是,如果需要-fast优化并且代码依赖于正确设置的errno值或在浮点库调用后引发的浮点异常,应在命令行上在-fast后使用以下选项进行编译,以禁止编译器优化此类库调用:-xbuiltin=%none-U__MATHERR_ERRNO_DONTCARE-xnolibmopt-xnolibmil要在任何平台上显示—fast的扩展,请运行命令CC—dryrun—fast,如以下示例所示.
>CC-dryrun-fast|&grep######commandlinefilesandoptions(expanded):###-dryrun-xO5-xarch=sparcvis2-xcache=64/32/4:1024/64/4\-xchip=ultra3i-xmemalign=8s-fsimple=2-fns=yes-ftrap=%none\-xlibmil-xlibmopt-xbuiltin=%all-D__MATHERR_ERRNO_DONTCARE另请参见-fns、-fsimple、-ftrap=%none、-xlibmil、-nofstore、-xO5、-xlibmopt和-xtarget=nativeA.
2.
17–features=a[,a.
.
.
]启用/禁用逗号分隔的列表中指定的各种C++语言功能.
A.
2.
17.
1值关键字a可以使用下表中显示的值.
no%前缀禁用关联的选项.
A.
2选项参考附录AC++编译器选项167表A–5-features值值含义%all已过时,请勿使用.
启用几乎所有的-features选项.
结果可能不可预测.
[no%]altspell识别替用的标记拼写(例如,"and"代替"&&").
缺省值为altspell.
[no%]anachronisms允许使用过时的构造.
禁用时(即-features=no%anachronisms),不允许使用任何过时构造.
缺省值为anachronisms.
[no%]bool允许bool类型和文字.
启用时,宏为_BOOL=1.
未启用时,不定义宏.
缺省值为bool.
[no%]conststrings将文字字符串放在只读存储器中.
缺省值为conststrings.
cplusplus_redef允许在命令行中通过-D选项重新定义以常规方式预定义的宏__cplusplus.
不允许在源代码中使用#define指令重新定义__cplusplus.
示例:CC—features=cplusplus_redef—D__cplusplus=1.
.
.
g++编译器通常将__cplusplus宏预定义为1,而某些源代码可能依赖于此非标准值.
(对于实现了1998C++标准或2003更新的编译器,标准值是199711L.
对于该宏,将来的标准要求采用更大的值.
)除非您需要将__cplusplus重新定义为1以编译打算供g++使用的代码,否则不要使用此选项.
[no%]except允许C++异常.
C++异常处于禁用状态时(即-features=no%except),接受但忽略函数的抛出规范,编译器不生成异常代码.
请注意,关键字try、throw和catch始终保留.
请参见第94页中的"8.
3禁用异常".
缺省值为except.
explicit识别关键字explicit.
不允许no%explicit选项.
[no%]export识别关键字export.
缺省值为export.
[no%]extensions允许其他C++编译器通常接受的非标准代码.
缺省值为no%extensions.
[no%]iddollar允许将$符号用作非词首标识符字符.
缺省值为no%iddollar.
[no%]localfor对for语句使用符合标准的局部作用域规则.
缺省值为localfor.
[no%]mutable识别关键字mutable.
缺省值为mutable.
namespace识别关键字namespace.
不允许nono%namespace选项.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01168表A–5-features值(续)值含义[no%]nestedacess允许嵌套类访问包容类的专有成员.
缺省值:-features=nestedaccessrtti允许运行时类型标识(runtimetypeidentification,RTTI).
不允许no%rtti选项.
[no%]rvalueref允许将非const引用绑定到rvalue或temporary.
缺省值:-features=no%rvalueref缺省情况下,C++强制执行非const引用不能绑定到temporary或rvalue的规则.
要覆盖此规则,请使用选项-features=rvalueref.
[no%]split_init将非局部静态对象的初始化程序放到各个函数中.
使用-features=no%split_init时,编译器将所有初始化函数放入一个函数中.
使用-features=no%split_init可最大限度减小代码大小,但编译时间可能增加.
缺省值为split_init.
[no%]transitions允许ARM语言构造,该构造在标准C++下会产生问题,且可能使程序无法按预期工作或以后可能不能编译.
使用-features=no%transitions时,编译器会将这些情况视为错误.
使用-features=transitions时,编译器会发出关于这些构造的警告,而不是错误消息.
以下构造视为转换错误:在使用了模板后再重新定义模板,遗漏模板定义中所需的typename指令,以及隐式声明类型int.
在以后的发行版本中可能会更改转换错误的集合.
缺省值为transitions.
[no%]strictdestrorder遵循由C++标准指定的、对具有静态存储持续时间的对象的析构顺序要求.
缺省值为strictdestrorder.
[no%]tmplrefstatic允许函数模板引用相关静态函数或静态函数模板.
缺省值是遵循标准的no%tmplrefstatic.
[no%]tmplife清除由完整表达式末尾处的某个表达式创建的临时对象,如ANSI/ISOC++标准中定义.
(-features=no%tmplife生效时,多数临时对象会在其块终结时清除.
)缺省值为tmplife.
%none已过时,请勿使用.
关闭几乎所有功能.
结果可能不可预测.
交互该选项会累积而不覆盖.
以下选项与标准库和头文件不兼容:no%boolno%exceptno%mutableA.
2选项参考附录AC++编译器选项169警告不要使用-features=%all或-features=%none.
这些关键字已过时并且在以后的发行版中可能会被删除.
结果可能不可预测.
使用-features=tmplife选项时,程序的行为可能会发生变化.
测试在使用与不使用-features=tmplife选项两种情况下程序是否正常运行是一种测试程序可移植性的方法.
另请参见表3–17和《C++迁移指南》A.
2.
18-filt[=filter[,filter.
.
.
]]控制编译器通常应用于链接程序和编译器错误消息的过滤功能.
A.
2.
18.
1值filter必须是下表中列出的值之一.
%no前缀禁用关联的子选项.
表A–6-filt值值含义[no%]errors显示链接程序错误消息的C++解释.
链接程序的诊断信息被直接提供到其他工具时,可以禁止这种解释.
[no%]names取消改编的C++链接程序名称.
[no%]returns取消改编函数的返回类型.
禁止该类型的改编可以使您更快速地识别函数的名称,但请注意联合变体返回的部分函数只在返回类型上有区别.
[no%]stdlib在链接程序和编译器错误消息中简化标准库的名称,并提供更简单的方式来识别标准库模板类型的名称.
%all等效于-filt=errors,names,returns,stdlib.
这是缺省行为.
%none等效于-filt=no%errors,no%names,no%returns,no%stdlib.
缺省值如果未指定-filt选项或指定了-filt但未提供任何值,则编译器假定-filt=%all.
示例以下示例显示了使用-filt选项编译该代码的效果.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01170//filt_demo.
ccclasstype{public:virtual~type();//nodefinitionprovided};intmain(){typet;}如果编译代码时不使用-filt选项,编译器就假定-filt=errors,names,returns,stdlib并显示标准输出.
example%CCfilt_demo.
ccUndefinedfirstreferencedsymbolinfiletype::~type()filt_demo.
otype::__vtblfilt_demo.
o[Hint:trycheckingwhetherthefirstnon-inlined,/non-purevirtualfunctionofclasstypeisdefined]ld:fatal:Symbolreferencingerrors.
Nooutputwrittentoa.
out以下命令禁止取消改编的C++链接程序名称取消改编,并禁止链接程序错误的C++解释.
example%CC-filt=no%names,no%errorsfilt_demo.
ccUndefinedfirstreferencedsymbolinfile__1cEtype2T6M_v_filt_demo.
o__1cEtypeG__vtbl_filt_demo.
old:fatal:Symbolreferencingerrors.
Nooutputwrittentoa.
out现在考虑以下代码:#include#includeintmain(){std::listl;std::strings(l);//errorhere}如果指定了-filt=no%stdlib,将生成以下输出:Error:Cannotusestd::list>toinitializestd::basic_string,std::allocator>.
如果指定了-filt=stdlib,将生成以下输出:Error:Cannotusestd::listtoinitializestd::string.
A.
2选项参考附录AC++编译器选项171交互指定了no%names时,returns和no%returns都无效.
也就是说,以下选项是相同的:-filt=no%names-filt=no%names,no%returns-filt=no%names,returnsA.
2.
19–flags与–xhelp=flags相同.
A.
2.
20-fma[={none|fused}](SPARC)启用自动生成浮点乘加指令.
-fma=none禁用这些指令的生成.
-fma=fused允许编译器通过使用浮点乘加指令,尝试寻找改进代码性能的机会.
缺省值是-fma=none.
要使编译器生成乘加指令,最低要求是-xarch=sparcfmaf且优先级别至少为-xO2.
如果生成了乘加指令,编译器会标记此二进制程序,以防止该程序在不受支持的平台上执行.
乘加指令可以免除乘法和加法之间的中间舍入步骤.
因此,如果使用-fma=fused编译,程序可能会生成不同的结果,但精度通常会增加而不是降低.
A.
2.
21–fnonstd这是可扩展至—ftrap=common(在x86上)和—fns—ftrap=common(在SPARC上)的宏.
有关更多信息,请参见–fns和–ftrap=common.
A.
2.
22–fns[={yes|no}]SPARC:启用/禁用SPARC的非标准浮点模式.
如果使用-fns=yes(或-fns),则会在程序开始执行时启用非标准浮点模式.
该选项提供了一种切换使用非标准浮点模式或标准浮点模式的方法,它接在包括–fns的其他某些宏选项(如–fast)后面.
在某些SPARC体系结构上,非标准浮点模式会禁用"逐渐下溢",这会导致很小的结果刷新为零而不是生成次正规数.
此外,还会导致次正规操作数在无提示的情况下替换为零.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01172对于那些硬件中不支持逐渐下溢和次正规数的SPARC体系结构,-fns=yes(或-fns)可以显著提高某些程序的性能.
x86:选择/取消选择SSE刷新为零模式,以及非正规数为零模式(如果可用).
此选项导致将次正规结果刷新为零.
如果可用的话,此选项还导致将次正规操作数视为零.
此选项对不使用SSE或SSE2指令集的传统x86浮点运算没有影响.
A.
2.
22.
1值-fns选项可以使用下表中列出的值.
表A–7-fns值值含义yes选择非标准浮点模式no选择标准浮点模式缺省值如果未指定-fns,则不自动启用非标准浮点模式.
进行标准IEEE754浮点计算(即逐渐下溢).
如果仅指定了–fns,则假定–fns=yes.
示例在以下示例中,-fast扩展为多个选项,其中一个是-fns=yes,即选择非标准浮点模式.
后续-fns=no选项覆盖初始设置,并选择浮点模式.
example%CCfoo.
cc-fast-fns=no警告非标准模式启动时,浮点运算可以产生不符合IEEE754标准要求的结果.
如果使用-fns选项编译一个例程,应使用–fns选项编译该程序的所有例程.
否则,可能会产生意外的结果.
只有编译主程序时该选项才有效.
使用–fns=yes(或-fns)选项时,如果程序中出现通常由IEEE浮点陷阱处理程序管理的浮点错误,则可能会生成警告消息.
另请参见《数值计算指南》和ieee_sun(3M)手册页A.
2选项参考附录AC++编译器选项173A.
2.
23–fprecision=px86:设置非缺省浮点精度模式.
–fprecision选项用于设置浮点控制字(floating-pointcontrolword,FPCW)中的舍入精度模式位.
这些位控制基本算术运算(加、减、乘、除和平方根)结果的舍入精度.

A.
2.
23.
1值p必须是下表中列出的值之一.
表A–8-fprecision值值含义single舍入到IEEE单精度值.
double舍入到IEEE双精度值.
extended舍入到最大可用精度.
如果p为single或double,该选项会使舍入精度模式在程序开始执行时分别设置为single或double精度.
如果p是extended或未使用–fprecision选项,则舍入精度模式保持为extended精度.
在single精度舍入模式下,结果将舍入到24个有效位;在double精度舍入模式下,结果将舍入到53个有效位.
在缺省的extended精度模式下,结果将舍入到64个有效位.
该模式只控制在寄存器中结果的舍入精度,而不影响范围.
寄存器中所有的结果都使用了各种已扩展的双精度格式来舍入.
不过,存储在内存中的结果既舍入到目标格式的范围也舍入到目标格式的精度.
float类型的标称精度为single.
longdouble类型的标称精度为extended.
缺省值如果未指定–fprecision选项,舍入精度模式缺省为extended.
警告该选项仅在x86系统上且仅在编译主程序时才有效,但如果编译64位(-m64)或SSE2启动的(-xarch=sse2)处理器,忽略此选项.
在SPARC系统上也忽略此选项.
A.
2.
24–fround=r启动时设置有效的IEEE舍入模式.
此选项设置编译器在评估常量表达式时可以使用的IEEE754舍入模式.
此舍入模式是在程序初始化过程中在运行时建立的.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01174含义与ieee_flags子例程的含义相同,可用于更改运行时的模式.
A.
2.
24.
1值r必须是下表中列出的值之一.
表A–9-fround值值含义nearest舍入到最接近的数字并转变为偶数.
tozero舍入到零.
negative舍入到负无穷大.
positive舍入到正无穷大.
缺省值如果未指定–fround选项,舍入模式缺省为-fround=nearest.
警告如果使用–fround=r编译一个例程,就必须使用相同的–fround=r选项编译程序的所有例程.
否则,可能会产生意外的结果.
只有编译主程序时该选项才有效.
请注意,使用—xvector或—xlibmopt进行编译时需要具有缺省的舍入模式.
与使用—xvector或—xlibmopt(或同时使用两者)编辑的库链接的程序必须确保缺省舍入生效.
A.
2.
25–fsimple[=n]选择浮点优化首选项.
该选项允许优化器制定关于浮点运算的简化假定.
A.
2.
25.
1值如果存在n,它必须是0、1或2.
表A–10-fsimple值值含义0不允许简化假定.
保持严格的IEEE754一致性.
A.
2选项参考附录AC++编译器选项175表A–10-fsimple值(续)值含义1允许保守简化.
产生的代码与IEEE754不完全一致,但多数程序所产生的数值结果没有更改.
在-fsimple=1的情况下,优化器可假定:在进程初始化之后,IEEE754缺省舍入/捕获模式不发生改变.
除产生潜在浮点异常的计算不能删除外,产生不可视结果的计算都可以删除.
使用无穷大或NaNs作为操作数的计算需要将NaNs传送到它们的结果中,即x*0可以用零替换.
计算不依赖于零的符号.
在-fsimple=1的情况下,不允许优化器不考虑舍入或异常进行完全优化.
具体来讲,运行时将舍入模式保存为常量时,不能用产生不同结果的计算来替换浮点计算.
2包括-fsimple=1的所有功能,还允许可能导致许多程序生成不同的数值结果(由于舍入的更改)的主动浮点优化.
例如,允许优化器将指定循环中的所有x/y运算替换为x*z,其中,要保证在循环z=1/y中至少对x/y求一次值,并且在执行该循环期间已知y和z的值为常量值.
缺省值如果未指定–fsimple,编译器将使用-fsimple=0.
如果指定了-fsimple但未指定n值,编译器将使用-fsimple=1.
交互-fast隐含了–fsimple=2.
警告该选项可以破坏IEEE754的一致性.
另请参见-fastA.
2.
26–fstore(x86)强制浮点表达式的精度.
在以下值为真时,该选项使编译器将浮点表达式或函数的值转换为赋值左侧的类型,而不是将该值保留在寄存器中:A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01176将表达式或函数分配到变量.
表达式被强制转换为较短的浮点类型.
要禁用此选项,请使用–nofstore选项.
在SPARC平台上,—fstore和—nofstore都将被忽略,并且出现一条警告.
A.
2.
26.
1警告由于误差和截断,结果可能会与寄存器值所生成的结果不同.
另请参见–nofstoreA.
2.
27-ftrap=t[,t.
.
.
]设置启动时生效的IEEE陷阱操作模式,但不安装SIGFPE处理程序.
可以使用ieee_handler(3M)或fex_set_handling(3M)启用陷阱并同时安装SIGFPE处理程序.
如果指定多个值,则按从左到右顺序处理列表.
A.
2.
27.
1值t可以为下表中所列出的值之一.
表A–11-ftrap值值含义[no%]division在除以零时自陷.
[no%]inexact在结果不精确时自陷.
[no%]invalid在操作无效时自陷.
[no%]overflow在溢出时自陷.
[no%]underflow在下溢时自陷.
%all在所有以上内容中自陷.
%none不在以上任何内容中自陷.
common在无效、除以零和溢出时自陷.
注意,选项的[no%]形式只用于修改%all和common值的含义,且必须与其中的一个值一起使用,如以下示例所示.
选项自身的[no%]形式不会显式导致禁用特定的陷阱.
缺省值如果未指定–ftrap,则编译器假定–ftrap=%none.
A.
2选项参考附录AC++编译器选项177示例–ftrap=%all,no%inexact意味着设置除inexact以外的所有陷阱.
警告如果使用–ftrap=t编译一个例程,就应使用相同的-ftrap=t选项编译程序的所有例程.
否则,可能会产生意外的结果.
使用-ftrap=inexact陷阱时务必谨慎.
只要浮点值不能精确表示,使用–ftrap=inexact便会产生自陷.
例如,以下语句就会产生这种情况:x=1.
0/3.
0;只有编译主程序时该选项才有效.
请小心使用该选项.
如果要启用IEEE陷阱,请使用–ftrap=common.
另请参见ieee_handler(3M)和fex_set_handling(3M)手册页.
A.
2.
28–G生成动态共享库而不是可执行文件.
缺省情况下,在命令行上指定的所有资源文件都是使用-xcode=pic13进行编译的.
在从包含模板且用-instances=extern选项编译的文件中生成共享库时,将自动从模板缓存中包含.
o文件引用的任何模板实例.
如果要通过指定-G与其他必须在编译时和链接时指定的编译器选项来创建共享对象,请确保在编译时和与生成的共享对象链接时也指定这些选项.
创建共享对象时,针对64位SPARC体系结构编译的所有目标文件也必须使用某个显式-xcode值进行编译,如第222页中的"A.
2.
113–xcode=a"中所推荐.
A.
2.
28.
1交互如果未指定–c(仅编译选项),以下选项将传递给链接程序:–dy–G–R警告请勿使用ld-G生成共享库,而应使用CC-G.
CC驱动程序会自动将C++所需的多个选项传递给ld.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01178使用-G选项时,编译器不将任何缺省-l选项传递到ld选项.
如果您要使共享库具有对另一共享库的依赖性,就必须在命令行上传递必需的-l选项.
例如,如果要使共享库依赖于libCrun,必须在命令行上传递-lCrun.
另请参见-dy、-xcode=pic13、–ztextld(1)手册页以及第148页中的"14.
3生成动态(共享)库".
A.
2.
29–g生成附加的符号表信息,以供使用dbx(1)或调试器进行调试以及使用性能分析器analyzer(1)进行分析.
指示编译器和链接程序准备进行调试和性能分析的文件或程序.
其任务包括:生成以目标文件和可执行文件的符号表形式表示的详细信息(称为stabs).
生成帮助程序函数,调试器可以调用这些函数来实现其某些功能.
如果未指定优化级别,则会禁用函数的内联生成;也就是说,在未指定优化级别时,使用此选项意味着使用了+d选项.
将-g结合-O或-xO级别不会禁用内联.
禁用优化的某些级别.
A.
2.
29.
1交互如果将此选项与–xOlevel(或其等效选项,如-O)一起使用,将会获得一些特定的调试信息.
有关更多信息,请参见第249页中的"A.
2.
151-xOlevel".
如果使用该选项且优化级别为-xO4或更高,编译器会为完全优化提供尽可能多的符号信息.
如果使用-g且不指定优化级别,将禁用函数调用的内联.
(如果随-g指定优化级别,会启用内联.
)指定此选项时,除非还指定-O或-xO,否则会自动指定+d选项.
要使用性能分析器的完整功能,请使用-g选项进行编译.
虽然某些性能分析功能不需要使用-g,但必须使用-g进行编译,以便查看注释的源代码、部分函数级别信息以及编译器注释消息.
有关更多信息,请参见analyzer(1)手册页和性能分析器手册.
使用-g生成的注释消息描述编译器在编译程序时进行的优化和变换.
使用er_src(1)命令来显示与源代码交叉的消息.
A.
2选项参考附录AC++编译器选项179警告如果在不同的步骤中编译和链接程序,则在一个步骤中使用-g选项而在另一个步骤中不使用该选项不会影响程序的正确性,但会影响调试程序的能力.
没有使用-g(或-g0)编译但使用-g(或-g0)链接的任何模块将不能正常进行调试.
请注意,通常必须使用-g选项(或-g0选项)编译包含函数main的模块才能对其进行调试.
另请参见+d、–g0、–xs、analyzer(1)手册页、er_src(1)手册页、ld(1)手册页以及《使用dbx调试程序》(介绍了有关stabs的详细信息)和性能分析器手册.
A.
2.
30–g0编译和链接以便进行调试,但不禁用内联.
此选项与–g相同,但+d处于禁用状态,dbx无法对内联函数使用步入功能.
如果指定-g0且优化级别为-xO3或更低,编译器会为近乎完全优化提供尽可能多的符号信息.
尾部调用优化和后端内联被禁用.
A.
2.
30.
1另请参见+d、-g和《使用dbx调试程序》A.
2.
31-g3生成其他调试信息.
—g3选项与具有附加调试符号表信息的—g0相同,允许dbx在源代码中显示宏扩展.
与使用—g0进行编译相比,此附加符号表信息会增大生成的.
o和可执行文件的大小.
A.
2.
32–H打印所包含文件的路径名.
在标准错误输出(stderr)中,该选项打印当前编译中包含的每个#include文件的路径名(每行一个).
A.
2.
33–h[]name为生成的动态共享库指定名称name.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01180这是一个链接程序选项,传递给ld.
通常,-h后面的名称应该与–o后面的名称完全相同.
–h和name之间的空格是可选的.
编译时的加载器将指定名称分配到正在创建的共享动态库中,并将该名称作为库的内部名称记录在库文件中.
如果没有–hname选项,则没有内部名称记录在库文件中.
每个可执行文件都具有所需的共享库文件列表.
当运行时链接程序将库链接到可执行文件中时,链接程序将内部名称从库复制到所需共享库文件的列表中.
如果没有共享文件的内部名称,链接程序就复制共享库文件的路径.
没有使用-h选项生成共享库时,运行时加载器仅查找库的文件名.
可以将库替换为具有相同文件名的不同库.
如果共享库有内部名称,加载器会在装入文件时检查内部名称.
如果内部名称不匹配,加载器不会使用替换文件.
A.
2.
33.
1示例example%CC-G-olibx.
so.
1-hlibx.
so.
1a.
ob.
oc.
oA.
2.
34–help与-xhelp=flags相同.
A.
2.
35-Ipathname将pathname添加到#include文件中的搜索路径中.
该选项用于将pathname添加到在其中搜索具有相对文件名(不以斜杠开头的文件名)的#include文件的目录列表.
编译器按以下顺序搜索用引号引住的文件(形式为#include"foo.
h"):1.
在包含源代码的目录中2.
在使用-I选项指定的目录(如果有)中3.
在编译器提供的C++头文件、ANSIC头文件和专用文件的include目录中4.
在/usr/include目录中编译器按以下顺序搜索用尖括号括住的文件(形式为#include):1.
在使用-I选项指定的目录(如果有)中2.
在编译器提供的C++头文件、ANSIC头文件和专用文件的include目录中3.
在/usr/include目录中A.
2选项参考附录AC++编译器选项181注–如果此拼写与标准头文件的名称匹配,另请参阅第117页中的"11.
7.
5标准头文件实现".
A.
2.
35.
1交互-I-选项让您可以覆盖缺省的搜索规则.
如果指定了-library=no%Cstd,那么编译器在其搜索路径中就不包括编译器提供的与C++标准库关联的头文件.
请参见第116页中的"11.
7替换C++标准库".
如果未使用–ptipath,编译器就会在–Ipathname中查找模板文件.
请使用–Ipathname而不是–ptipath.
该选项会累积而不覆盖.
警告任何时候都不要将编译器安装区域/usr/include、/lib或/usr/lib指定为搜索目录.
另请参见-I-A.
2.
36-I-更改包含文件搜索规则.
对于形式为#include"foo.
h"的include文件,按以下顺序搜索目录:1.
使用-I选项指定的目录(在-I-前后).
2.
编译器提供的C++头文件、ANSIC头文件和专用文件的目录3.
/usr/include目录对于#include形式的include文件,按以下顺序搜索目录:1.
使用-I选项指定的目录(在-I-后面)2.
编译器提供的C++头文件、ANSIC头文件和专用文件的目录3.
/usr/include目录A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01182注–如果包括文件的名称与标准头的名称相匹配,另请参阅第117页中的"11.
7.
5标准头文件实现".
A.
2.
36.
1示例以下示例显示了编译prog.
cc时使用-I-的结果.
prog.
cc#include"a.
h"#include#include"c.
h"c.
h#ifndef_C_H_1#define_C_H_1intc1;#endifinc/a.
h#ifndef_A_H#define_A_H#include"c.
h"inta;#endifinc/b.
h#ifndef_B_H#define_B_H#includeintb;#endifinc/c.
h#ifndef_C_H_2#define_C_H_2intc2;#endif以下命令显示了针对形式为#include"foo.
h"的包含语句搜索当前目录(包含文件的目录)的缺省行为.
在inc/a.
h中处理#include"c.
h"语句时,编译器将inc子目录中的c.
h头文件包含进来.
在prog.
cc中处理#include"c.
h"语句时,编译器将包含prog.
cc的目录中的c.
h文件包含进来.
请注意,-H选项指示编译器输出所包含文件的路径.
example%CC-c-Iinc-Hprog.
ccinc/a.
hinc/c.
hinc/b.
hinc/c.
hc.
h以下命令显示了-I-选项的效果.
编译器处理形式为#include"foo.
h"的语句时,并不先在包含目录中查找,而是按照通过-I选项指定的目录在命令行上的显示顺序搜索这些目录.
在inc/a.
h中处理#include"c.
h"语句时,编译器包含.
/c.
h头文件而不是inc/c.
h头文件.
example%CC-c-I.
-I--Iinc-Hprog.
ccinc/a.
hA.
2选项参考附录AC++编译器选项183.
/c.
hinc/b.
hinc/c.
h.
/c.
h交互命令行上有-I-时,编译器从不搜索当前目录,除非在-I指令中显式列出了该目录.
甚至是形式为#include"foo.
h"的包含语句,也是这种情况.
警告只有命令行上的第一个-I-会导致出现所述行为.
任何时候都不要将编译器安装区域/usr/include、/lib或/usr/lib指定为搜索目录.
A.
2.
37–i指示链接程序ld忽略任何LD_LIBRARY_PATH和LD_LIBRARY_PATH_64设置.
A.
2.
38-includefilename此选项使编译器处理filename的方式就相当于其是位于主源文件首行的#include预处理程序指令.
考虑源文件t.
c:main(){.
.
.
}如果使用命令cc-includet.
ht.
c编译t.
c,则编译时好像源文件包含以下项:#include"t.
h"main(){.
.
.
}编译器在其中搜索filename的第一个目录是当前工作目录而不是包含主源文件的目录,这就是显式包括某个文件时的情况.
例如,下面的目录结构包含两个名称相同但位置不同的头文件:foo/t.
ct.
hbar/u.
ct.
hA.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01184如果您的工作目录是foo/bar,并且您使用命令cc.
.
/t.
c-includet.
h进行编译,则编译器会包括foo/bar中的t.
h而不是foo/中的此文件,后者是源文件t.
c内包含#include指令时的情况.
如果编译器在当前工作目录中找不到使用-include指定的文件,则会在正常目录路径中搜索该文件.
如果您指定多个-include选项,则文件的包括顺序与它们在命令行中的顺序相同.
A.
2.
39-inline与-xinline相同.
A.
2.
40–instances=a控制模板实例的放置和链接.
A.
2.
40.
1值a必须是下表中列出的值之一.
表A–12-instances值值含义extern将全部所需实例放置到链接程序comdat部分内的模板系统信息库并向其赋予全局链接.
(如果系统信息库中的实例过期,就会被重新实例化.
)注意:如果在不同的步骤中进行编译和链接,并且在编译步骤中指定了-instance=extern,则还必须在链接步骤中指定该选项.
explicit将显式实例化的实例放置到当前目标文件中并赋予全局链接.
不生成其他任何所需实例.
global将全部所需的实例放置到当前目标文件中并赋予全局链接.
semiexplicit将显式实例化的实例放置到当前目标文件中并赋予全局链接.
将显式实例所需的全部实例放置到当前目标文件中并赋予全局链接.
不生成其他任何所需实例.
static注意:-instances=static已过时.
您不再需要使用-instances=static,因为-instances=global现在提供了静态的所有优点而没有其缺点.
以前编译器中提供的该选项用于克服此编译器版本中不存在的问题.
将全部所需的实例放置到当前目标文件中并赋予静态链接.
A.
2选项参考附录AC++编译器选项185缺省值如果未指定–instances,则假定–instances=global.
另请参见第86页中的"7.
2.
4模板实例的放置和链接"A.
2.
41–instlib=filename使用该选项可避免在库(共享或静态)和当前对象中生成重复的模板实例.
一般来说,如果程序与库共享大量实例,可以尝试使用-instlib=filename,看看编译时间是否会减少.
A.
2.
41.
1值使用filename参数指定包含可由当前编译生成的模板实例的库.
filename参数必须包含正斜杠"/"字符.
对于相对于当前目录的路径,请使用点斜杠".
/".
缺省值-instlib=filename选项没有缺省值,只有在指定后才能使用.
该选项可被多次指定和累积.
示例假定libfoo.
a和libbar.
so库可对与源文件a.
cc共享的大量模板实例进行实例化.
添加-instlib=filename并指定库可通过避免冗余有利于减少编译时间.
example%CC-c-instlib=.
/libfoo.
a-instlib=.
/libbar.
soa.
cc交互使用-g进行编译时,如果使用-instlib=file指定的库没有使用-g编译,那么这些模板实例不可调试.
解决方法是避免在使用-g时使用-instlib=file.
警告如果使用-instlib指定库,就必须与该库链接.
另请参见-template、-instances和-ptiA.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01186A.
2.
42–KPICSPARC:(已过时)与–xcode=pic32相同.
x86:与–Kpic相同.
生成共享库时使用该选项编译源文件.
对全局数据的每个引用都生成为全局偏移表中指针的非关联化.
每个函数调用都是通过过程链接表在程序计数器(programcounter,pc)相对寻址模式下生成的.
A.
2.
43–KpicSPARC:(已过时)与–xcode=pic13相同.
x86:使用与位置无关的代码进行编译.
生成共享库时使用该选项编译源文件.
对全局数据的每个引用都生成为全局偏移表中指针的非关联化.
每个函数调用都是通过过程链接表在程序计数器(programcounter,pc)相对寻址模式下生成的.
A.
2.
44–keeptmp保留编译时创建的临时文件.
该选项与–verbose=diags一起使用,对调试很有用.
A.
2.
44.
1另请参见–v,–verboseA.
2.
45–L路径将path添加到要在其中搜索库的目录列表.
该选项传递给ld.
搜索顺序是先搜索通过path指定的目录,再搜索编译器提供的目录.
A.
2.
45.
1交互该选项会累积而不覆盖.
警告任何时候都不要将编译器安装区域/usr/include、/lib或/usr/lib指定为搜索目录.
A.
2选项参考附录AC++编译器选项187A.
2.
46–llib将库liblib.
a或liblib.
so添加到链接程序的搜索库列表.
该选项传递给ld.
库的名称通常为liblib.
a或liblib.
so,其中lib和.
a或.
so部分是必需的.
应该使用此选项指定lib部分.
您可以根据需要在单个命令行上放置任意数量的库.
将按照使用–Ldir指定的顺序对库进行搜索.
请在目标文件名之后使用该选项.
A.
2.
46.
1交互该选项会累积而不覆盖.
将-lx放在源文件和目标文件列表之后,这样可以确保按正确顺序搜索库.
警告为了确保正确的库链接顺序,必须使用-mt(而不是-lthread)与libthread链接.
另请参见–Ldir和-mtA.
2.
47–libmieee与–xlibmieee相同.
A.
2.
48–libmil与-xlibmil相同.
A.
2.
49-library=l[,l.
.
.
]将指定的CC提供的库加入编译和链接操作中.
A.
2.
49.
1值关键字l必须是下表中列出的值之一.
no%前缀禁用关联的选项.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01188表A–13-library值值含义[no%]f77已过时.
改用-xlang=f77.
[no%]f90已过时.
改用-xlang=f90.
[no%]f95已过时.
改用-xlang=f95.
[no%]rwtools7使用传统iostreamTools.
h++版本7.
[no%]rwtools7_dbg使用支持调试的传统iostreamTools.
h++版本7.
[no%]rwtools7_std使用标准iostreamTools.
h++版本7.
[no%]rwtools7_std_dbg使用支持调试的标准iostreamTools.
h++版本7.
[no%]interval已过时.
不要使用.
使用-xia.
[no%]iostream使用传统iostream库libiostream.
[no%]Cstd使用C++标准库libCstd.
包括编译器提供的C++标准库头文件.
[no%]Crun使用C++运行时库libCrun.
[no%]gc使用libgc垃圾收集.
[no%]stlport4使用STLport的标准库实现版本4.
5.
3,而不是缺省的libCstd.
关于使用STLport实现的更多信息,请参见第123页中的"12.
2STLport".
[no%]stlport4_dbg使用STLport的支持调试的库.
[no%]sunperf使用Sun性能库.
[no%]stdcxx4在Solaris中使用Apachestdcxx版本4C++标准库,而不是使用缺省的libCstd.
此选项还会隐式设置-mt选项.
stdcxx库需要使用多线程模式.
必须在整个应用程序的每个编译和链接命令中一致使用此选项.
用-library=stdcxx4编译的代码与用缺省的-library=Cstd或可选的-library=stlport4编译的代码不能用在同一程序中.
%none仅使用C++库libCrun.
A.
2.
49.
2缺省值标准模式(缺省模式)libCstd库总是包括在内,除非使用-library=%none、-library=no%Cstd、—library=stdcxx4或-library=stlport4明确将其排除.
A.
2选项参考附录AC++编译器选项189libCrun库总是包括在内,除非使用-library=no%Crun明确将其排除.
始终会包括libm库,即使指定了-library=%none.
A.
2.
49.
3示例要在标准模式下没有任何C++库(libCrun除外)的情况下进行链接,请使用:example%CC-library=%none要在标准模式下将传统iostreamRoguetools.
h++库包含进来,请使用:example%CC–library=rwtools7,iostream要在标准模式下将标准iostreamRogueWavetools.
h++库包含进来,请使用:example%CC-library=rwtools7_stdA.
2.
49.
4交互如果使用-library指定了库,则在编译期间会设置适当的–I路径.
在链接期间会设置适当的–L、–YP、–R路径和–l选项.
该选项会累积而不覆盖.
在使用区间运算库时,必须包括以下库之一:libC、libCstd或libiostream.
使用-library选项可确保针对指定库的-l选项按正确顺序处理.
例如,对于-library=rwtools7,iostream和-library=iostream,rwtools7,-l选项都是按照-lrwtool-liostream顺序传递给ld.
指定的库在系统支持库链接之前链接.
对于—library=stdcxx4,必须在OracleSolarise平台上的/usr/include和/usr/lib中安装stdcxxApache库.
不能在同一个命令行上使用-library=sunperf和-xlic_lib=sunperf.
在任何命令行中,最多只能使用-library=stlport4、-library=stdcxx4和-library=Cstd选项之一.
每次只能使用一个RogueWave工具库,而且不能将任何RogueWave工具库与-library=stlport4或-library=stdcxx4一起使用.
在标准模式(缺省模式)下包含传统iostreamRogueWave工具库时,必须也要包含libiostream(有关其他信息,请参见《C++迁移指南》.
只能在标准模式下使用标准iostreamRogueWave工具库.
以下命令示例显示了有效使用和无效使用RogueWavetools.
h++库选项的情况.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01190%CC-library=rwtools7,iostreamfoo.
cc#includeintmain(){std::coutstructS{voidimf(){}staticvoidsmf(){}};templateclassS;intmain(){}example%指定了-template=geninlinefuncs时,即使在程序中没有调用S的两个成员函数,也会在目标文件中生成它们.
example%CC-c-template=geninlinefuncsExample.
ccexample%nm-CExample.
oExample.
o:[Index]ValueSizeTypeBindOtherShndxName[5]00NOTYGLOB0ABS__fsr_init_value[1]00FILELOCL0ABSb.
c[4]1632FUNCGLOB02main[3]10424FUNCLOCL02voidS::imf()[__1cBS4Ci_Dimf6M_v_][2]6420FUNCLOCL02voidS::smf()[__1cBS4Ci_Dsmf6F_v_]A.
2.
86.
4另请参见第85页中的"7.
2.
2整个类实例化"和第90页中的"7.
5模板定义搜索"A.
2.
87–time与–xtime相同.
A.
2.
88-traceback[={%none|common|signals_list}]如果执行中出现严重错误,将发出堆栈跟踪.
当程序生成某些信号时,-traceback选项会导致可执行文件向stderr发出堆栈跟踪、转储信息并退出.
如果多个线程都生成一个信号,则只为第一个生成堆栈跟踪.

要使用回溯,请在链接时将-traceback选项添加到编译器命令行中.
编译时也接受该选项,除非生成可执行二进制文件,否则将忽略此选项.
不要将-traceback和-G一起使用来创建共享库.
A.
2选项参考附录AC++编译器选项203表A–18-traceback选项选项含义common指定应在出现以下任意一组常见信号时发出堆栈跟踪:sigill、sigfpe、sigbus、sigsegv或sigabrt.
signals_list指定应生成堆栈跟踪的信号名称的逗号分隔列表,采用小写形式.
可以捕捉以下信号(导致生成信息转储文件的信号):sigquit、sigill、sigtrap、sigabrt、sigemt、sigfpe、sigbus、sigsegv、sigsys、sigxcpu、sigxfsz.
可以在上述任一信号前加上no%以禁用信号缓存.
例如:如果发生sigsegv或sigfpe,-traceback=sigsegv,sigfpe将生成堆栈跟踪和信息转储.
%none或none禁用回溯如果不指定该选项,则缺省值为-traceback=%none只使用-traceback而不使用=符号表示-traceback=common注意:如果不希望进行信息转储,可以使用以下命令将信息转储文件大小限制设置为零:%limitcoredumpsize0-traceback选项不影响运行时性能.
A.
2.
89–Uname删除预处理程序符号name的初始定义.
该选项会删除在命令行上通过-D(包括CC驱动程序隐式放在命令行上的选项)创建的宏符号name的所有初始定义.
该选项对任何其他预定义的宏和源文件中的宏定义都没有影响.
要查看CC驱动程序放在命令行上的-D选项,请将-dryrun选项添加到命令行上.
A.
2.
89.
1示例以下命令取消预定义符号__sun的定义.
foo.
cc中的预处理程序语句(例如#ifdef(__sun))会知道该符号已取消定义.
example%CC-U__sunfoo.
ccA.
2.
89.
2交互可以在命令行上指定多个-U选项.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01204所有-U选项都在出现的任何-D选项之后处理.
也就是说,如果在命令行上为-D和-U指定了相同的name,则name是未定义的,而不管这些选项出现的顺序如何.
A.
2.
89.
3另请参见-DA.
2.
90–unroll=n与–xunroll=n相同.
A.
2.
91–V与–verbose=version相同.
A.
2.
92–v与–verbose=diags相同.
A.
2.
93–verbose=v[,v…]控制编译器详细程度.
A.
2.
93.
1值v必须是下表中列出的值之一.
no%前缀禁用关联的选项.
表A–19-verbose值值含义[no%]diags为每个编译传递输出命令行.
[no%]template打开模板实例verbose模式(有时称为"检验"模式).
verbose模式显示编译过程中出现的每个实例阶段.
[no%]version指示CC驱动程序输出它调用的程序的名称和版本号.
%all调用所有其他选项.
%none-verbose=%none与-verbose=no%template,no%diags,no%version相同.
缺省值如果未指定–verbose,则假定–verbose=%none.
A.
2选项参考附录AC++编译器选项205交互该选项会累积而不覆盖.
A.
2.
94-Wc,arg将参数arg传递给指定的组件c.
前后参数之间只能用逗号分隔.
所有-W参数均在其余的命令行参数之后进行传递.
要在参数中包括逗号,请在紧靠逗号之前使用转义符\(反斜杠).
所有-W参数均在常规命令行参数之后进行传递.
例如,-Wa,-o,objfile按该顺序将-o和objfile传递给汇编程序.
此外,-Wl,-I,name将导致链接阶段覆盖动态链接程序的缺省名称/usr/lib/ld.
so.
1.
这些参数相对于其他指定的命令行选项传递给工具的顺序可能会更改后续的编译器发行版.
下表列出了c的可能值.
表A–20-W标志标志含义a汇编程序:(fbe);(gas)cC++代码生成器:(cg)(SPARC)dCC驱动程序l链接编辑器(ld)mmcsO(大写的o)过程间优化器o(小写字母o)后优化器p预处理程序(cpp)0(Zero)编译器(ccfe)2优化器:(iropt)注意:不能使用-Wd将CC选项传递给C++编译器.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01206A.
2.
95+w识别出可能会产生意外后果的代码.
使用+w选项时,如果函数过大而无法内联或未使用声明的程序元素,就不再生成警告.
这些警告不指定源代码中的真正问题,因此不适合某些开发环境.
从+w中删除这些警告就可以在这些环境下更主动地使用+w.
在+w2选项中仍可以使用这些警告.
该选项生成在下列方面有问题的构造的更多相关警告:不可移植可能出错低效A.
2.
95.
1缺省值如果未指定+w,则编译器发出有关极可能是问题的构造的警告.
A.
2.
95.
2另请参见–w和+w2A.
2.
96+w2发出+w发出的所有警告以及可能无害但可能降低程序最大可移植性的技术违规的警告.
+w2选项不再发出关于在系统头文件中使用与实现相关的构造方面的警告.
因为系统头文件是实现,所以发出警告是不合适的.
从+w2删除这些警告可以更主动地使用该选项.
A.
2.
96.
1另请参见+wA.
2.
97–w抑制大部分警告消息.
该选项使编译器不输出警告消息.
但不能抑制某些警告(尤其是有关严重记时错误的警告).
A.
2.
97.
1另请参见+wA.
2选项参考附录AC++编译器选项207A.
2.
98-Xlinkerarg将arg传递给链接程序ld(1).
与—zarg等效A.
2.
99–Xm与–features=iddollar相同.
A.
2.
100-xaddr32(仅限Solarisx86/x64)-xaddr32=yes编译标志将生成的可执行文件或共享对象限定于32位地址空间.
以这种方式编译的可执行文件会导致创建限定为32位地址空间的进程.
指定了-xaddr32=no时,将生成普通的64位二进制文件.
如果未指定-xaddr32选项,则假定-xaddr32=no.
如果仅指定了-xaddr32,则假定-xaddr32=yes.
此选项仅适用于-m64编译,并且仅在支持SF1_SUNW_ADDR32软件功能的OracleSolaris平台上适用.
由于Linux内核不支持地址空间限制,此选项在Linux上不可用.
链接时,如果单个目标文件是使用-xaddr32=yes编译的,则假定整个输出文件是使用-xaddr32=yes编译的.
限定为32位地址空间的共享对象必须由在受限的32位模式地址空间内执行的进程装入.
有关更多信息,请参阅《链接程序和库指南》中的SF1_SUNW_ADDR32软件功能定义.
A.
2.
101-xalias_level[=n]指定以下命令时,C++编译器可以执行基于类型的别名分析和优化:-xalias_level[=n]其中n是any、simple或compatible.
A.
2.
101.
1-xalias_level=any在此分析级别上,编译器假定任何类型都可以为其他类型起别名.
不过尽管只是假定,但还是可以执行某些优化.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01208A.
2.
101.
2-xalias_level=simple编译器假定简单的类型没有别名.
存储对象必须是属于以下简单类型之一的动态类型:char、signedchar、unsignedcharwchar_t数据指针类型shortint、unsignedshortint、intunsignedint函数指针类型longint、unsignedlongint、longlongint、unsignedlonglongint数据成员指针类型float、doublelongdouble枚举类型函数成员指针类型存储对象只能通过以下类型的左值访问:对象的动态类型对象动态类型的constant或volatile限定版本,与对象动态类型相对应的带符号或不带符号的类型与动态类型对象的constant或volatile限定版本对应的带符号或无符号类型在其成员(包括递归的子集成员或包含的联合)中包括上述类型的聚集或联合类型char或unsignedchartype.
A.
2.
101.
3-xalias_level=compatible编译器假定布局不兼容类型没有别名.
存储对象只能通过以下类型的左值访问:对象的动态类型对象动态类型的constant或volatile限定版本,与对象动态类型相对应的带符号或不带符号的类型与动态类型对象的constant或volatile限定版本对应的带符号或无符号类型在其成员(包括递归的子集成员或包含的联合)中包括上述类型的聚集或联合类型动态类型对象的(可能是constant或volatile限定)基类类型char或unsignedchartype.
编译器假定所有引用的类型都与相应存储对象的动态类型是布局兼容的.
两种类型在以下情况下是布局兼容的:如果两种类型是同一类型如果两种类型仅在不变和可变限定方面存在区别对于每个带符号整数类型,如果存在对应(但不相同)的无符号整数类型,则这些对应类型是布局兼容的.
如果两个枚举类型具有相同的基础类型,则它们是布局兼容的.
如果两个简单旧数据(plainolddata,POD)结构类型具有相同数量的成员,并且对应的成员(按顺序)具有布局兼容的类型,那么这两个结构类型是布局兼容的.

A.
2选项参考附录AC++编译器选项209如果两个POD联合类型具有相同数量的成员,并且对应的成员(按顺序)具有布局兼容的类型,那么这两个联合类型是布局兼容的.
在某些情况下具有存储对象动态类型的引用可能是非布局兼容的:如果POD联合包含了两个或两个以上共享通用初始序列的POD结构,且POD联合对象当前包含了其中一个POD结构,就可以检查任何POD结构的通用初始部分.
对包含一个或多个初始成员的序列来说,如果相应成员具有布局兼容类型(适用于位字段)和相同宽度,则两个POD结构共享一个通用初始序列.
指向POD结构对象的指针(使用reinterpret_cast适当转换)将指向该结构的初始成员,而如果该成员是位字段则指向该结构所在的单元.
A.
2.
101.
4缺省值如果未指定-xalias_level,则编译器将该选项设置为-xalias_level=any.
如果指定了-xalias_level但未提供值,则编译器将该选项设置为-xalias_level=compatible.
A.
2.
101.
5交互编译器在-xO2和更低的优化级别不执行基于类型的别名分析.
A.
2.
101.
6警告如果要使用reinterpret_cast或等价的旧式强制类型转换,程序可能会违反分析假定.
此外,联合类型也违反了分析假设,如以下示例所示.
unionbitbucket{inti;floatf;};intbitsof(floatf){bitbucketvar;var.
f=3.
6;returnvar.
i;}A.
2.
102-xanalyze={code|no}为可使用OracleSolarisStudio代码分析器查看的源代码生成静态分析.
使用—xanalyze=code进行编译并在单独的步骤中进行链接时,还需要在链接步骤中包括—xanalyze=code.
缺省值为—xanalyze=no.
有关更多信息,请参见OracleSolarisStudio代码分析器文档.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01210A.
2.
103-xannotate[=yes|no](仅限Solaris)创建随后可由优化和检测工具binopt(1)、code-analyzer(1)、discover(1)、collect(1)和uncover(1)使用的二进制文件.
缺省值为-xannotate=yes.
指定不带值的-xannotate等效于-xannotate=yes.
为优化使用优化和监测工具,-xannotate=yes必须在编译时和链接时均有效.
如果不使用优化和监测工具,则使用-xannotate=no进行编译和链接可以生成略小的二进制文件和库.
此选项在Linux系统上不可用.
A.
2.
104–xar创建归档库.
生成使用模板的C++归档文件时,请将在模板系统信息库中实例化的那些模板函数包括在该归档文件中.
仅在使用-instances=extern选项编译了至少一个目标文件时才使用模板系统信息库.
使用—xar进行编译可以根据需要自动将这些模板添加到归档文件中.
但是,由于编译器在缺省情况下不使用模板高速缓存,因此通常不需要使用—xar选项.
您可以使用无格式ar(1)命令创建C++代码的归档文件(.
a文件),除非某些代码是使用—instances=extern编译的.
在此情况下(或者如果您不确定),请使用CC—xar命令而不是ar命令.
A.
2.
104.
1值对调用ar-c-r指定-xar并重新创建归档文件.
示例以下命令行归档包含在库和目标文件中的模板函数.
example%CC-xar-olibmain.
aa.
ob.
oc.
o警告请勿在命令行上添加来自模板数据库中的.
o文件.
请勿直接使用ar命令生成归档文件.
应使用CC–xar以确保模板实例自动包括在归档文件中.
另请参见ar(1)手册页A.
2选项参考附录AC++编译器选项211A.
2.
105–xarch=isa指定目标指令集体系结构(instructionsetarchitecture,ISA).
该选项将编译器生成的代码限制为特定指令集体系结构的指令.
此选项不保证使用任何特定于目标的指令.
不过,使用该选项会影响二进制程序的可移植性.
注–分别使用-m64或-m32选项来指定打算使用的内存模型LP64(64位)或ILP32(32位).
-xarch选项不再指示内存模型,除非是为了与早期的发行版兼容,如下所示.
如果代码使用的_asm语句或内联模板(.
il文件)使用了特定于体系结构的指令,则在编译时可能需要使用相应的—xarch值以避免出现编译错误.
如果在不同的步骤中编译和链接,请确保在两个步骤中为-xarch指定了相同的值.
有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见第43页中的"3.
3.
3编译时选项和链接时选项".
A.
2.
105.
1用于SPARC和x86的-xarch标志下表列出了SPARC和x86平台通用的-xarch关键字.
表A–21适用于SPARC和x86的—xarch标志标志含义generic使用大多数处理器通用的指令集.
这是缺省值.
generic64为了在大多数64位平台上获得良好性能而进行编译.
此选项与-m64-xarch=generic等效,用于与早期的发行版兼容.
native为了在此系统上获得良好性能而进行编译.
编译器为运行它的当前系统处理器选择适当的设置.
native64为了在此系统上获得良好性能而进行编译.
此选项与-m64-xarch=native等效,用于与早期的发行版兼容.
A.
2.
105.
2用于SPARC的-xarch标志下表提供了SPARC平台上每个-xarch关键字的详细信息.
表A–22用于SPARC平台的-xarch标志标志含义sparc针对SPARC-V9ISA(但不带有可视化指令集(VisualInstructionSet,VIS),也不带有其他特定于实现的ISA扩展)进行编译.
该选项在V9ISA上使编译器生成高性能代码.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01212表A–22用于SPARC平台的-xarch标志(续)标志含义sparcvis针对SPARC-V9加可视指令集(VisualInstructionSet,VIS)版本1.
0进行编译,并具有UltraSPARC扩展.
该选项在UltraSPARC体系结构上使编译器生成高性能代码.
sparcvis2此选项允许编译器在具有UltraSPARCIII扩展的UltraSPARC体系结构以及可视化指令集(VIS)2.
0版上生成目标代码.
sparcvis3针对SPARC-V9ISA的SPARCVIS版本3进行编译.
允许编译器使用SPARC-V9指令集、UltraSPARC扩展(包括可视指令集(VisualInstructionSet,VIS)版本1.
0、UltraSPARC-III扩展(包括可视指令集版本2.
0以及混合乘加指令和可视指令集版本3.
0中的指令.
sparcfmaf允许编译器使用SPARC-V9指令集,加UltraSPARC扩展(包括可视指令集(VisualInstructionSet,VIS)版本1.
0)、UltraSPARC-III扩展(包括可视指令集(VisualInstructionSet,VIS)版本2.
0)以及面向浮点乘加的SPARC64VI扩展中的指令.
必须将-xarch=sparcfmaf与fma=fused结合使用,并具有某个优化级别,以使编译器尝试查找机会来自动使用乘加指令.
sparcima针对SPARC-V9ISA的SPARCIMA版本进行编译.
使编译器可以使用如下指令集内的指令:SPARC-V9指令集、UltraSPARC扩展(包括可视化指令集(VisualInstructionSet,VIS)版本1.
0)、UltraSPARC-III扩展(包括可视化指令集(VisualInstructionSet,VIS)版本2.
0)、SPARC64VI扩展(用于浮点乘加)和SPARC64VII扩展(用于整数乘加).
sparc4针对SPARC-V9ISA的SPARC4版本进行编译.
允许编译器使用SPARC-V9指令集以及扩展(包括VIS1.
0)、UltraSPARC-III扩展(包括VIS2.
0、混合浮点乘加指令、VIS3.
0和SPARC4指令)中的指令.
v9等效于-m64-xarch=sparc.
使用-xarch=v9来获取64位内存模型的传统makefile和脚本仅需使用-m64.
v9a等效于-m64-xarch=sparcvis,并与早前的发行版兼容.
v9b等效于-m64-xarch=sparcvis2,并与早前的发行版兼容.
另请注意:用generic,sparc,sparcvis2,sparcvis3,sparcfmaf,sparcima编译的对象二进制文件(.
o)可以链接起来并一起执行,但只能在支持链接的所有指令集的处理器上运行.
对于任何特定选择,生成的可执行文件在传统体系结构中可能不运行或运行缓慢.
而且,由于所有指令集中均未实现四精度(longdouble)浮点指令,因此编译器不在其生成的代码中使用这些指令.
A.
2.
105.
3用于x86的-xarch标志下表列出了x86平台上的-xarch标志.
A.
2选项参考附录AC++编译器选项213表A–23针对x86的-xarch标志标志含义amd64等效于-m64-xarch=sse2(仅限Solaris).
使用-xarch=amd64来获取64位内存模型的传统makefile和脚本仅需要使用-m64.
amd64a等效于-m64-xarch=sse2a(仅限Solaris).
pentium_pro使指令集限于32位PentiumPro体系结构.
pentium_proa将AMD扩展(3DNow!
、3DNow!
扩展和MMX扩展)添加到32位PentiumPro体系结构中.
sse将SSE指令集添加到PentiumPro体系结构.
ssea将AMD扩展(3DNow!
、3DNow!
扩展和MMX扩展)添加到32位SSE体系结构中.
sse2将SSE2指令集添加到PentiumPro体系结构.
sse2a将AMD扩展(3DNow!
、3DNow!
扩展和MMX扩展)添加到32位SSE2体系结构中.
sse3将SSE3指令集添加到SSE2指令集中.
sse3a将AMD扩展指令(包括3dnow)添加到SSE3指令集.
ssse3使用SSSE3指令集补充PentiumPro、SSE、SSE2和SSE3指令集.
sse4_1使用SSE4.
1指令集补充PentiumPro、SSE、SSE2、SSE3和SSSE3指令集.
sse4_2使用SSE4.
2指令集补充PentiumPro、SSE、SSE2、SSE3、SSSE3和SSE4.
1指令集.
amdsse4a使用AMDSSE4a指令集.
aes使用Intel高级加密标准指令集.
avx使用Intel高级向量扩展指令集.
如果在x86平台上使用—m64编译或链接程序的任一部分,则也必须使用这些选项之一编译程序的所有部分.
有关各种Intel指令集体系结构(SSE、SSE2、SSE3、SSSE3等)的详细信息,请参阅Intel-64和IA-32《IntelArchitectureSoftwareDeveloper'sManual》另请参见第26页中的"1.
2x86特殊注意事项"和第27页中的"1.
4二进制兼容验证".
A.
2.
105.
4交互尽管可以单独使用该选项,但它是-xtarget选项的扩展的一部分,并且可用于覆盖由特定的-xtarget选项设置的-xarch值.
例如,-xtarget=ultra2可扩展为A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01214-xarch=v8plusa-xchip=ultra2-xcache=16/32/1:512/64/1.
在以下命令中,-xarch=v8plusb覆盖了由-xtarget=ultra2的扩展设置的-xarch=v8plusa.
example%CC-xtarget=ultra2-xarch=v8plusbfoo.
cc不支持–compat[=4]与-xarch=generic64、-xarch=native64、-xarch=v9、-xarch=v9a或-xarch=v9b结合使用.
A.
2.
105.
5警告如果在进行优化时使用该选项,那么在指定体系结构上适当选择就可以提供高性能的可执行文件.
但如果选择不当就会导致性能的严重降级,或导致在预定目标平台上无法执行二进制程序.
如果在不同的步骤中编译和链接,请确保在两个步骤中为-xarch指定了相同的值.
A.
2.
106-xautopar为多个处理器启用自动并行化.
执行依赖性分析(对循环进行迭代间数据依赖性分析)和循环重构.
如果优化级别不是-xO3或更高,则将优化级别提高到-xO3并发出警告.
如果要进行自己的线程管理,请勿使用-xautopar.
要达到更快的执行速度,则该选项需要多处理器系统.
在单处理器系统中,生成的二进制文件的运行速度通常较慢.
要在多线程环境中运行已并行化的程序,必须在执行之前将环境变量OMP_NUM_THREADS设置为大于1的值.
如果未设置,则缺省值为2.
要使用多个线程,请将OMP_NUM_THREADS设置为更大的值.
将OMP_NUM_THREADS设置为1,则会仅使用一个线程运行.
通常,应将OMP_NUM_THREADS设置为正在运行的系统中的可用虚拟处理器数,该值可使用OracleSolarispsrinfo(1)命令确定.
如果使用-xautopar且在一个步骤中进行编译和链接,则链接会自动将微任务化库和线程安全的C运行时库包含进来.
如果使用-xautopar并在不同的步骤中进行编译和链接,则还必须使用-xautopar进行链接.
A.
2.
106.
1另请参见第251页中的"A.
2.
152-xopenmp[=i]"A.
2.
107-xbinopt={prepare|off}(SPARC)此选项现在已废弃,将在以后的编译器发行版中删除.
请参见第211页中的"A.
2.
103-xannotate[=yes|no]"A.
2选项参考附录AC++编译器选项215指示编译器准备二进制文件,以便以后进行优化、转换和分析.
请参见binopt(1)手册页.
此选项可用于生成可执行文件或共享对象.
如果在不同的步骤中进行编译,则在编译步骤和链接步骤中都必须有-xbinopt:example%cc-c-xO1-xbinopt=preparea.
cb.
cexample%cc-omyprog-xbinopt=preparea.
o如果有些源代码不可用于编译,仍可使用此选项来编译其余代码.
然后,应将其用于可创建最终库的链接步骤中.
在此情况下,只有用此选项编译的代码才能进行优化、转换或分析.
A.
2.
107.
1缺省值缺省值为-xbinopt=off.
交互此选项必须与-xO1或更高的优化级别一起使用时才有效.
使用此选项生成二进制文件时,文件大小会有所增加.
使用-xbinopt=prepare和-g编译会将调试信息包括在内,从而增加可执行文件的大小.
A.
2.
108-xbuiltin[={%all|%default|%none}]启用或禁用对标准库调用进行优化改进.
使用-xbuiltin选项可改善对调用标准库函数的代码的优化.
此选项使编译器可在对性能有益时替换内函数或内联系统函数.
要了解如何解读编译器注释输出来确定编译器替换了哪些函数,请参见er_src(1)手册页.
使用—xbuiltin=%all时,替换会导致errno的设置变得不可靠.
如果您的程序依赖于errno的值,请不要使用此选项.
—xbuiltin=%default仅内联未设置errno的函数.
errno的值在任何优化级别上都始终是正确的,并且可以可靠地检查.
在—xO3或更低级别上使用—xbuiltin=%default时,编译器将确定哪些调用有利于内联,并且不内联其他调用.
-xbuiltin=%none选项表示采用缺省编译器行为,编译器对内置函数不进行任何特殊优化.
A.
2.
108.
1缺省值如果没有指定—xbuiltin,则在以优化级别—xO1或更高级别进行编译时缺省值为—xbuiltin=%default,而在以—xO0级别进行编译时,缺省值为—xbuiltin=%none.
如果指定—xbuiltin时未带参数,则缺省为—xbuiltin=%all,编译器会更积极地替换内部函数或者对标准库函数进行内联.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01216请注意,—xbuiltin仅内联系统头文件中定义的全局函数,从不内联用户定义的静态函数.
尝试在全局函数上进行插入的用户代码可能会导致出现不确定的行为.

交互宏-fast的扩展包括了-xbuiltin=%all.
示例下面的编译器命令请求标准库调用的特殊处理.
example%CC-xbuiltin-cfoo.
cc下面的编译器命令请求不要对标准库调用进行特别处理.
请注意,宏-fast的扩展包括了-xbuiltin=%all.
example%CC-fast-xbuiltin=%none-cfoo.
ccA.
2.
109–xcache=c定义要由优化器使用的高速缓存属性.
此选项不保证使用每个特定的缓存属性.

注–尽管该选项可单独使用,但它是-xtarget选项扩展的一部分.
它的主要用途是覆盖-xtarget选项提供的值.
可选属性[/ti]用于设置可以共享缓存的线程数.
A.
2.
109.
1值c必须是下表中列出的值之一.
表A–24-xcache值值含义generic指示编译器在多数x86和SPARC处理器上使用缓存属性来获得高性能,而不降低任何处理器的性能.
(缺省值)如果需要,在每个新的发行版本中都会调整最佳定时属性.
native设置在主机环境中最佳性能的参数.
s1/l1/a1[/t1]定义级别1缓存属性A.
2选项参考附录AC++编译器选项217表A–24-xcache值(续)值含义s1/l1/a1[/t1]:s2/l2/a2[/t2]定义级别1和2缓存属性s1/l1/a1[/t1]:s2/l2/a2[/t2]:s3/l3/a3[/t3]定义级别1、2和3缓存属性下表中介绍了高速缓存属性si/li/ai/ti的定义:属性定义si级别为i时的数据高速缓存的大小(KB)li级别为i时的数据高速缓存的行大小(字节)ai级别为i时的数据高速缓存的关联性ti共享级别为i的缓存的硬件线程数例如,i=1指定1级高速缓存属性s1/l1/a1.
缺省值如果未指定-xcache,则假定为缺省值–xcache=generic.
该值指示了编译器在多数SPARC处理器上使用缓存属性来获得高性能,而不降低任何处理器的性能.
如果没有为t指定值,则缺省值为1.
示例–xcache=16/32/4:1024/32/1指定以下值:Level1Cache(级别1高速缓存)16K字节,32字节行大小,四路关联Level2Cache(级别2高速缓存)1024K字节,32字节行大小,直接映射关联另请参见–xtarget=tA.
2.
110-xchar[=o]提供此选项只是为了方便从char类型定义为unsigned的系统中迁移代码.
如果不是从这样的系统中迁移,最好不要使用该选项.
只有那些依赖字符类型符号的程序才需要重写,它们要改写成显式指定带符号或者无符号.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01218A.
2.
110.
1值可以将o替换为下表中列出的值之一.
表A–25-xchar值值含义signed将声明为字符的字符常量和变量视为带符号的.
此选项会影响已编译代码的行为,而不影响库例程的行为.
s与signed等效unsigned将声明为字符的字符常量和变量视为无符号的.
此选项会影响已编译代码的行为,而不影响库例程的行为.
u等效于unsigned缺省值如果未指定-xchar,编译器将假定-xchar=s.
如果指定了-xchar但未指定值,编译器将假定-xchar=s.
交互-xchar选项仅会更改使用-xchar编译的代码中char类型的值范围.
该选项不会更改任何系统例程或头文件中char类型的值范围.
具体来讲,当指定了此选项时,limits.
h定义的CHAR_MAX和CHAR_MIN值不会更改.
因此,CHAR_MAX和CHAR_MIN不再表示无格式char中可编码的值的范围.
警告如果使用-xchar=unsigned,则在将char与预定义的系统宏进行比较时要特别小心,因为宏中的值可能带符号.
对于任何返回错误代码而且可以用宏来访问错误代码的例程,此情况是最常见的.
错误代码一般是负值,因此在将char与此类宏中的值进行比较时,结果始终为假.
负数永远不等于无符号类型的值.
绝不要使用-xchar为通过库导出的任何接口编译例程.
OracleSolarisABI将char类型指定为带符号,并且系统库的行为也与此相适应.
目前还未对系统库针对将char指定为无符号的效果进行广泛测试.
可以不使用该选项,而是修改代码使其与char类型是否带符号没有关联.
类型char的符号种类因编译器和操作系统而异.
A.
2选项参考附录AC++编译器选项219A.
2.
111-xcheck[=i]使用-xcheck=stkovf进行编译将增加对单线程程序中的主线程以及多线程程序中的从属线程堆栈进行堆栈溢出运行时检查.
如果检测到堆栈溢出,则生成SIGSEGV.
有关如何以与其他地址空间违规的处理方式不同的方式处理堆栈溢出导致的SIGSEGV的信息,请参见sigaltstack(2).
A.
2.
111.
1值i必须是下表中列出的值之一.
表A–26-xcheck值值含义%all执行全部检查.
%none不执行检查.
stkovf打开堆栈溢出检查.
no%stkovf关闭堆栈溢出检查.
init_local初始化局部变量.
有关详细信息,请参见《C用户指南》.
no%init_local不初始化局部变量(缺省设置).
缺省值如果未指定-xcheck,则编译器缺省使用-xcheck=%none.
如果指定了没有任何参数的-xcheck,则编译器缺省使用-xcheck=%none.
在命令行上-xcheck选项不进行累积.
编译器按照上次出现的命令设置标志.
A.
2.
112-xchip=c指定要由优化器使用的目标处理器.
–xchip选项通过指定目标处理器来指定定时属性.
该选项影响以下属性:指令的顺序(即调度)编译器使用分支的方法语义上等价的其他指令可用时使用的指令A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01220注–尽管该选项可单独使用,但它是-xtarget选项扩展的一部分.
它的主要用途是覆盖-xtarget选项提供的值.
A.
2.
112.
1值c必须是下面的两个表中列出的值之一.
表A–27适用于SPARC处理器的-xchip值generic在大多数SPARC处理器上性能良好native在运行编译器的主机SPARC系统上性能良好sparc64viSPARC64VI处理器sparc64viiSPARC64VII处理器sparc64viiplusSPARC64VII+处理器ultraUltraSPARC处理器ultra2UltraSPARCII处理器ultra2eUltraSPARCIIe处理器ultra2iUltraSPARCIIi处理器ultra3UltraSPARCIII处理器ultra3cuUltraSPARCIIICu处理器ultra3iUltraSparcIIIi处理器ultra4UltraSPARCIV处理器ultra4plusUltraSPARCIVplus处理器ultraT1UltraSPARCT1处理器ultraT2UltraSPARCT2处理器.
ultraT2plusUltraSPARCT2+处理器.
T3SPARCT3处理器.
T4SPARCT4处理器.
表A–28适用于x86/x64处理器的-xchip值generic在大多数x86处理器上性能良好native在运行编译器的主机x86系统上性能良好A.
2选项参考附录AC++编译器选项221表A–28适用于x86/x64处理器的-xchip值(续)core2IntelCore2处理器nehalemIntelNehalem处理器opteronAMDOpteron处理器penrynIntelPenryn处理器pentiumIntelPentium处理器pentium_proIntelPentiumPro处理器pentium3IntelPentium3式处理器pentium4IntelPentium4式处理器amdfam10AMDAMDFAM10处理器sandybridgeIntelSandyBridge处理器westmereIntelWestmere处理器缺省值在大多数处理器中,generic为缺省值,即指示编译器使用最佳定时属性以获得高性能,而不会显著降低任何处理器的性能.
A.
2.
113–xcode=a(仅限SPARC)指定代码地址空间.
注–应通过指定-xcode=pic13或-xcode=pic32生成共享对象.
未使用pic13或pic32生成的共享对象不能正常工作,也可能根本无法生成.
A.
2.
113.
1值a必须是下表中列出的值之一.
表A–29-xcode值值含义abs32生成快速但有范围限制的32位绝对地址.
代码+数据+bss的大小被限制为2**32字节.
abs44SPARC:生成具有适当速度和范围的44位绝对地址.
代码+数据+bss的大小不应超过2**44字节.
只适用于64位架构.
请勿将该值与动态(共享)库一起使用.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01222表A–29-xcode值(续)值含义abs64SPARC:生成缓慢但无范围限制的64位绝对地址.
只适用于64位架构.
pic13生成快速但有范围限制的位置无关代码(小模型).
与-Kpic等效.
允许在32位架构上最多引用2**11个唯一的外部符号,而在64位架构上可以最多引用2**10个.
pic32生成与位置无关的代码(大模型),这可能没有pic13快,但有完整范围.
等效于-KPIC.
允许在32位体系结构上最多引用2**30个唯一的外部符号,而在64位体系结构上最多可以引用2**29个.
要确定是使用–xcode=pic13还是使用–xcode=pic32,请使用elfdump-c检查全局偏移表(GlobalOffsetTable,GOT)的大小并查找节头sh_name:.
got.
sh_size值是GOT的大小.
如果GOT小于8,192字节,请指定-xcode=pic13,否则指定-xcode=pic32.
有关更多信息,请参见elfdump(1)手册页.
通常,应根据以下准则来确定如何使用-xcode:如果要生成可执行文件,则不应该使用-xcode=pic13或-xcode=pic32.
如果是生成仅用于链接到可执行文件的归档库,则不应该使用-xcode=pic13或-xcode=pic32.
如果要生成共享库,请以–xcode=pic13开始.
一旦GOT大小超过8,192字节,请使用-xcode=pic32.
如果要生成用于链接到共享库的归档库,只能使用-xcode=pic32.
缺省值对于32位体系结构,缺省值是-xcode=abs32.
64位体系结构的缺省值是-xcode=abs44.
生成共享动态库时,缺省-xcode值abs44和abs32将与64位体系结构一起使用.
但指定-xcode=pic13或-xcode=pic32.
在SPARC上使用–xcode=pic13和–xcode=pic32时存在两项名义性能开销:用–xcode=pic13或–xcode=pic32编译的例程会在入口点执行一些附加指令,以将寄存器设置为指向用于访问共享库的全局变量或静态变量的表(_GLOBAL_OFFSET_TABLE_).
对全局或静态变量的每次访问都会涉及通过_GLOBAL_OFFSET_TABLE_的额外间接内存引用.
如果是使用-xcode=pic32进行编译,则对于每个全局和静态内存引用还要执行另外两个指令.
在考虑上述成本时,请记住:由于受到库代码共享的影响,使用-xcode=pic13和-xcode=pic32会大大减少系统内存需求.
共享库中使用-xcode=pic13或–xcode=pic32A.
2选项参考附录AC++编译器选项223编译的每页代码都可以供使用该库的每个进程共享.
如果共享库中的代码页包含非pic(即绝对)内存引用,即使仅包含单个非pic内存引用,该页也将变为不可共享,而且每次执行使用该库的程序时都必须创建该页的副本.
确定是否已经使用-xcode=pic13或–xcode=pic32编译了.
o文件的最简单方法是使用nm命令:%nmfile.
o|grep_GLOBAL_OFFSET_TABLE_U_GLOBAL_OFFSET_TABLE_包含与位置无关的代码的.
o文件将包含对_GLOBAL_OFFSET_TABLE_无法解析的外部引用(用字母U标记).
要确定是使用–xcode=pic13还是使用–xcode=pic32,应使用nm确定库中使用或定义的不同全局变量和静态变量的数量.
如果_GLOBAL_OFFSET_TABLE_的大小小于8,192字节,就可以使用-Kpic.
否则,就必须使用-xcode=pic32.
A.
2.
114-xdebugformat=[stabs|dwarf]编译器已将调试器信息格式从stabs("符号表")格式迁移到"DWARF调试信息格式"中指定的dwarf格式.
缺省设置为-xdebugformat=dwarf.
如果要维护读取调试信息的软件,您现在可以选择将工具从stabs格式转换为dwarf格式.
出于移植工具的目的,可以通过此选项来使用新的格式.
除非您要维护读取调试器信息的软件,或者特定工具要求使用这些格式之一的调试器信息,否则不需要使用此选项.
表A–30-xdebugformat标志值含义stabs-xdebugformat=stabs生成使用stabs标准格式的调试信息.
dwarf-xdebugformat=dwarf生成的调试信息采用dwarf标准格式.
如果未指定-xdebugformat,编译器将假定-xdebugformat=dwarf.
此选项需要一个参数.
此选项影响使用-g选项记录的数据的格式.
即使在没有使用-g的情况下记录少量调试信息,此选项仍可控制其信息格式.
因此,即使不使用-g,-xdebugformat仍有影响.
dbx和性能分析器软件可识别stabs和dwarf格式,因此使用此选项对任何工具的功能都没有影响.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01224注–Stabs格式并不能提供当前由dbx使用的所有调试数据,并且某些代码可能无法成功使用stabs来生成调试数据.
有关更多信息,另请参见dumpstabs(1)和dwarfdump(1)手册页.
A.
2.
115-xdepend=[yes|no]对循环进行迭代间数据相关项分析,并执行循环重构,包括循环交换、循环合并、标量替换和"死数组"赋值消除.
在SPARC处理器上,对于–xO3及更高的所有优化级别,–xdepend缺省为–xdepend=on.
否则,–xdepend缺省为–xdepend=off.
指定–xdepend的显式设置会覆盖任何缺省设置.
在x86处理器上,–xdepend缺省为–xdepend=off.
指定-xdepend且优化级别不是–xO3或更高级别时,编译器会将优化级别提高到–xO3并发出警告.
指定不带参数的–xdepend等效于–xdepend=yes.
-xautopar中包括依赖性分析.
依赖性分析在编译时完成.
依赖性分析在单处理器系统中可能很有用.
但是,如果在单处理器系统上使用–xdepend,不应该同时指定–xautopar,因为将针对多处理器系统进行–xdepend优化.
A.
2.
115.
1另请参见–xprefetch_auto_typeA.
2.
116-xdumpmacros[=value[,value.
.
.
]]要查看宏在程序中的行为方式时使用此选项.
该选项提供了诸如宏定义、取消定义的宏和宏用法实例的信息,并按宏的处理顺序将输出信息输出到标准错误(stderr).
-xdumpmacros选项在整个文件中或在dumpmacros或end_dumpmacrospragma覆盖它之前都是有效的.
请参见第286页中的"B.
2.
5#pragmadumpmacros".
A.
2.
116.
1值下表列出了value的有效参数.
前缀no%可禁用关联的值.
A.
2选项参考附录AC++编译器选项225表A–31-xdumpmacros值值含义[no%]defs输出所有宏定义.
[no%]undefs输出所有取消定义的宏.
[no%]use输出关于使用的宏的信息.
[no%]loc另外输出defs、undefs和use的位置(路径名和行号).
[no%]conds输出在条件指令中使用的宏的使用信息.
[no%]sys输出系统头文件中的宏的所有宏定义、取消定义和使用信息.
%all设置该选项即表示-xdumpmacros=defs,undefs,use,loc,conds,sys.
该参数最好与[no%]形式的其他参数配合使用.
例如,-xdumpmacros=%all,no%sys表示输出中不包含系统头文件宏,但仍提供所有其他宏的信息.
%none不输出任何宏信息.
该选项的值会累积,因此指定-xdumpmacros=sys-xdumpmacros=undefs与-xdumpmacros=undefs,sys的效果相同.
注–子选项loc、conds和sys是defs、undefs和use选项的限定符.
使用loc、conds和sys本身并不会生成任何结果.
例如,使用-xdumpmacros=loc,conds,sys不会生成什么结果.
缺省值指定不带任何参数的-xdumpmacros缺省设置为-xdumpmacros=defs,undefs,sys.
未指定-xdumpmacros时的缺省值为-xdumpmacros=%none.
示例如果使用选项-xdumpmacros=use,no%loc,则使用的每个宏名称只输出一次.
但是,如果要了解更多详细信息,请使用选项-xdumpmacros=use,loc,这样每次使用宏时都会打印位置和宏名称.
例如以下文件t.
c:example%catt.
c#ifdefFOO#undefFOO#defineCOMPUTE(a,b)a+b#else#defineCOMPUTE(a,b)a-bA.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01226#endifintn=COMPUTE(5,2);intj=COMPUTE(7,1);#ifCOMPUTE(8,3)+NN+MMintk=0;#endif以下示例显示了使用defs、undefs、sys和loc参数时文件t.
c的输出.
example%CC-c-xdumpmacros-DFOOt.
c#define__SunOS_5_91#define__SUNPRO_CC0x590#defineunix1#definesun1#definesparc1#define__sparc1#define__unix1#define__sun1#define__BUILTIN_VA_ARG_INCR1#define__SVR41#define__SUNPRO_CC_COMPAT5#define__SUN_PREFETCH1#defineFOO1#undefFOO#defineCOMPUTE(a,b)a+bexample%CC-c-xdumpmacros=defs,undefs,loc-DFOO-UBARt.
ccommandline:#define__SunOS_5_91commandline:#define__SUNPRO_CC0x590commandline:#defineunix1commandline:#definesun1commandline:#definesparc1commandline:#define__sparc1commandline:#define__unix1commandline:#define__sun1commandline:#define__BUILTIN_VA_ARG_INCR1commandline:#define__SVR41commandline:#define__SUNPRO_CC_COMPAT5commandline:#define__SUN_PREFETCH1commandline:#defineFOO1commandline:#undefBARt.
c,line2:#undefFOOt.
c,line3:#defineCOMPUTE(a,b)a+b以下示例说明了use、loc和conds参数如何报告文件t.
c中宏的行为:example%CC-c-xdumpmacros=uset.
cusedmacroCOMPUTEexample%CC-c-xdumpmacros=use,loct.
ct.
c,line7:usedmacroCOMPUTEt.
c,line8:usedmacroCOMPUTEexample%CC-c-xdumpmacros=use,condst.
cusedmacroFOOusedmacroCOMPUTEusedmacroNNA.
2选项参考附录AC++编译器选项227usedmacroMMexample%CC-c-xdumpmacros=use,conds,loct.
ct.
c,line1:usedmacroFOOt.
c,line7:usedmacroCOMPUTEt.
c,line8:usedmacroCOMPUTEt.
c,line9:usedmacroCOMPUTEt.
c,line9:usedmacroNNt.
c,line9:usedmacroMM例如文件y.
c:example%caty.
c#defineX1#defineYX#defineZYinta=Z;以下示例基于y.
c中的宏显示了-xdumpmacros=use,loc的输出:example%CC-c-xdumpmacros=use,locy.
cy.
c,line4:usedmacroZy.
c,line4:usedmacroYy.
c,line4:usedmacroX另请参见Pragmadumpmacros/end_dumpmacros会覆盖-xdumpmacros命令行选项的作用域.
A.
2.
117-xe仅检查语法和语义错误.
指定-xe时,编译器不生成任何目标代码.
-xe的输出定向到stderr.
如果不需要通过编译生成目标文件,可使用-xe选项.
例如,如果要尝试通过删除代码段找出导致出现错误消息的原因,可使用-xe加速编辑和编译周期.
A.
2.
117.
1另请参见–cA.
2.
118-xF[=v[,v.
.
.
]]启用通过链接程序对函数和变量进行最佳重新排列.
该选项指示编译器将函数和/或数据变量放置到单独的分段中,这样链接程序就可以使用链接程序-M选项指定的映射文件中的指示将这些段重新排序以优化程序性能.
通常,该优化仅在缺页时间构成程序运行时间的一大部分时才有效.

A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01228对变量重新排序有助于解决对运行时性能产生负面影响的以下问题:在内存中存放位置很近的无关变量会造成缓存和页的争用在内存中存放位置很远的相关变量会造成不必要的过大工作集未用到的弱变量副本会造成不必要的过大工作集,从而降低有效数据密度为优化性能而对变量和函数进行重新排序时,需要执行以下操作:1.
使用-xF进行编译和链接.
2.
按照性能分析器手册中关于如何生成函数的映射文件或《链接程序和库指南》中关于如何生成数据的映射文件的说明进行操作.
3.
使用通过链接程序的-M选项生成的新映射文件重新链接.
4.
在分析器下重新执行以验证是否增强.
A.
2.
118.
1值v可以是下表中列出的一个或多个值.
no%前缀禁用关联的值.
表A–32-xF值值含义[no%]func将函数分段到单独的段中.
[no%]gbldata将全局数据(具有外部链接的变量)分段到单独的段中.
[no%]lcldata将局部数据(具有内部链接的变量)分段到单独的段中.
%all分段函数、全局数据和局部数据.
%none不分段.
缺省值如果未指定-xF,则缺省值为-xF=%none.
如果指定了没有任何参数的-xF,则缺省值为-xF=%none,func.
交互使用-xF=lcldata会限制某些地址计算优化,因此,只应在必要时才使用该标志.
另请参见analyzer(1)和ld(1)手册页A.
2.
119-xhelp=flags显示了对每个编译器选项的简要描述.
A.
2选项参考附录AC++编译器选项229A.
2.
120-xhwcprof(仅限SPARC)为基于硬件计数器的分析启用编译器支持.
如果启用了-xhwcprof,编译器将生成信息,这些信息可帮助工具将分析的加载和存储指令与其所引用的数据类型和结构成员相关联(与使用-g生成的符号信息结合).
它将分析数据与目标的数据空间(而非指令空间)相关联.
使用此选项可以对行为进行深入洞察,单独通过指令分析难以做到这一点.
可使用-xhwcprof编译一组指定的目标文件.
但是,当应用于应用程序中的所有目标文件时,-xhwcprof是最有用的,它能全面识别并关联分布在应用程序的目标文件中的所有内存引用.
如果在不同的步骤中进行编译和链接,最好在链接时使用-xhwcprof.
如果将来扩展为-xhwcprof,则在链接时可能需要使用它.
-xhwcprof=enable或-xhwcprof=disable的实例将会覆盖同一命令行中-xhwcprof的所有以前的实例.
在缺省情况下,禁用-xhwcprof.
指定不带任何参数的-xhwcprof与-xhwcprof=enable等效.
-xhwcprof要求启用优化并选择DWARF调试数据格式.
请注意,DWARF格式(-xdebugformat=dwarf)现在是缺省格式.
组合使用-xhwcprof和-g会增加编译器临时文件的存储需求,而且高于单独指定-xhwcprof和-g所引起的增加总量.
下列命令可编译example.
cc,并可为硬件计数器分析以及针对使用DWARF符号的数据类型和结构成员的符号分析指定支持:example%CC-c-O-xhwcprof-g-xdebugformat=dwarfexample.
cc有关基于硬件计数器的分析的更多信息,请参见性能分析器手册.
A.
2.
121-xia链接适当的区间运算库,并设置适当的浮点环境.
注–C++区间运算库与Fortran编译器中实现的区间运算相兼容.
在x86平台上,该选项需要SSE2指令集支持.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01230A.
2.
121.
1扩展-xia选项是一个扩展到-fsimple=0-ftrap=%none-fns=no-library=interval的宏.
如果使用区间并通过为-fsimple、-ftrap、-fns或-library指定不同的标志来覆盖-xia设置的内容,则可能会导致编译器出现不正确的行为.
A.
2.
121.
2交互要使用区间运算库,请将包含进来.
在使用区间运算库时,必须包括以下库之一:Cstd或iostream.
有关包括这些库的信息,请参见-library.
A.
2.
121.
3警告如果您使用区间并为-fsimple、-ftrap或-fns指定了不同的值,则您的程序可能显示不正确的行为.
C++区间运算处于实验阶段且正在改进.
具体功能可能随发行版本而变.
A.
2.
121.
4另请参见-libraryA.
2.
122-xinline[=func-spec[,func-spec.
.
.
]]指定在-xO3或更高的优化级别优化器可以内联用户编写的哪些例程.
A.
2.
122.
1值func-spec必须是下表中列出的值之一.
表A–33-xinline值值含义%auto在-xO4或更高的优化级别上启用自动内联.
此参数告知优化器它可以内联所选择的函数.
请注意,如果没有指定%auto,则在命令行上使用-xinline=[no%]func-name.
.
.
指定显式内联后,通常会禁用自动内联.
func_name强烈请求优化器内联函数.
如果函数未声明为extern"C",则必须改编func_name的值.
可以对可执行文件使用nm命令来查找改编的函数名.
对于已声明为extern"C"的函数,编译器不改编名称.
no%func_name如果为列表上的例程添加名称前缀no%,则会禁止内联该例程.
关于func-name已改编名称的规则也适用于no%func-name.
A.
2选项参考附录AC++编译器选项231只有使用了-xipo[=1|2]时,才会内联要编译的文件中的例程.
优化器决定适合内联的例程.
A.
2.
122.
2缺省值如果未指定-xinline选项,则编译器假定-xinline=%auto.
如果指定了没有任何参数的-xinline=,则不内联函数,而不管优化级别是什么.
A.
2.
122.
3示例要启用自动内联同时禁用内联声明为intfoo()的函数,请使用以下命令:example%CC-xO5-xinline=%auto,no%__1cDfoo6F_i_-ca.
cc要强烈要求内联声明为intfoo()的函数,并使所有其他函数作为要内联的候选函数,请使用以下命令:example%CC-xO5-xinline=%auto,__1cDfoo6F_i_-ca.
cc要强烈要求内联声明为intfoo()的函数,且不允许内联任何其他函数,请使用以下命令:example%CC-xO5-xinline=__1cDfoo6F_i_-ca.
ccA.
2.
122.
4交互优化级别低于-xO3时,-xinline选项不起作用.
在-xO4或更高的优化级别上,优化器会决定应该内联哪些函数,无需指定-xinline选项即可完成.
另外,在-xO4或更高的优化级别上,编译器会尝试确定内联哪些函数可以提高性能.
如果出现以下任一情况,则会内联例程.
优化级别为-xO3或更高认为内联有益且安全函数在要编译的文件中,或函数在使用-xipo[=1|2]编译了的文件中A.
2.
122.
5警告如果使用-xinline强制内联函数,实际上可能会降低性能.
A.
2.
122.
6另请参见第239页中的"A.
2.
130-xldscope={v}"A.
2.
123-xinstrument=[no%]datarace指定此选项编译并检测您的程序,以供线程分析器进行分析.
有关线程分析器的更多详细信息,请参见tha(1)手册页.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01232然后可使用性能分析器以collect-rraces来运行此检测过的程序,从而创建数据争用检测实验.
可以单独运行已检测的代码,但其运行速度将非常缓慢.
可指定-xinstrument=no%datarace来关闭线程分析器的源代码准备.
这是缺省值.
指定-xinstrument时必须带参数.
如果在不同的步骤中进行编译和链接,则在编译和链接步骤都必须指定-xinstrument=datarace.
此选项定义了预处理程序令牌__THA_NOTIFY.
可指定#ifdef__THA_NOTIFY来保护对libtha(3)例程的调用.
该选项也设置-g.
A.
2.
124-xipo[={0|1|2}]执行过程间优化.
-xipo选项通过调用过程间分析传递来执行部分程序优化.
它会在链接步骤中对所有目标文件执行优化,且优化不限于只是编译命令中的那些源文件.
但是,使用-xipo执行的整个程序优化不包括汇编(.
s)源文件.
编译和链接大型多文件应用程序时,-xipo选项特别有用.
用该标志编译的对象目标文件具有在这些文件内编译的分析信息,这些信息实现了在源代码和预编译的程序文件中的过程间分析.
但分析和优化只限于使用-xipo编译的目标文件,并不扩展到目标文件或库.
A.
2.
124.
1值-xipo选项可以使用下表中列出的值.
表A–34-xipo值值含义0不执行过程间的优化1执行过程间的优化2执行过程间的别名分析和内存分配及布局的优化,以提高缓存的性能A.
2.
124.
2缺省值如果未指定-xipo,则假定-xipo=0.
如果仅指定了-xipo,则假定-xipo=1.
A.
2选项参考附录AC++编译器选项233A.
2.
124.
3示例以下示例在相同的步骤中编译和链接.
example%CC-xipo-xO4-oprogpart1.
ccpart2.
ccpart3.
cc优化器在最后一个链接步骤中在三个源文件之间执行交叉文件内联.
不必一次编译所有源文件,可以分多次进行编译,每次编译时都指定-xipo选项.
以下示例在不同的步骤中编译和链接.
example%CC-xipo-xO4-cpart1.
ccpart2.
ccexample%CC-xipo-xO4-cpart3.
ccexample%CC-xipo-xO4-oprogpart1.
opart2.
opart3.
o在编译步骤中创建的目标文件具有在文件内部编译的附加分析信息,这样就可以在链接步骤中执行跨文件优化.
A.
2.
124.
4何时不使用-xipo过程间分析在链接步骤中使用目标文件集合时,编译器试图执行整个程序分析和优化.
对于该目标文件集合中定义的任何函数或子例程foo(),编译器做出以下两个假定:运行时在该目标文件集合之外定义的其他例程不显式调用foo().
目标文件集合中的任何例程调用foo()时,不会插入该目标文件集合之外定义的不同版本的foo().
如果第一个假设对于给定的应用程序不成立,请勿使用-xipo=2进行编译.
如果第二个假设不成立,请不要使用-xipo=1也不要使用-xipo=2进行编译.
例如,如果对函数malloc()创建了您自己的版本,并使用-xipo=2进行编译.
对于任何库中引用malloc()且与您的代码链接的所有函数,也都必须使用-xipo=2进行编译,并且需要在链接步骤中对其目标文件进行操作.
由于该策略可能不适用于系统库,因此不要使用-xipo=2编译您的malloc()版本.
另举一例,如果生成了一个共享库,有两个外部调用(foo()和bar())分别在两个不同的源文件中.
并假设bar()调用foo().
如果可能会在运行时插入foo(),则不要使用-xipo=1或-xipo=2编译foo()或bar()的源文件.
否则,foo()会内联到bar()中,从而导致出现错误的结果.
A.
2.
124.
5交互-xipo选项要求优化级别至少为-xO4.
A.
2.
124.
6警告在不同的步骤中进行编译和链接时,必须在这两个步骤中都指定-xipo才有效.
没有使用-xipo编译的对象可以自由地与使用-xipo编译的对象链接.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01234即使使用-xipo对库进行了编译,这些库也不参与交叉文件的过程间分析,如以下示例中所示.
example%CC-xipo-xO4one.
cctwo.
ccthree.
ccexample%CC-xar-omylib.
aone.
otwo.
othree.
o.
.
.
example%CC-xipo-xO4-omyprogmain.
ccfour.
ccmylib.
a本示例中,在one.
cc、two.
cc和three.
cc之间以及main.
cc和four.
cc之间执行过程间优化,但不在main.
cc或four.
cc和mylib.
a中的例程之间执行过程间优化.
(第一个编译可能生成有关未定义符号的警告,但仍可执行过程间优化,因为过程间优化是编译和链接的一个步骤.
)由于执行跨文件优化时需要附加信息,因此-xipo选项会生成更大的目标文件.
不过,该附加信息不会成为最终的二进制可执行文件的一部分.
可执行程序大小的增加都是由于执行的附加优化导致的.
A.
2.
124.
7另请参见-xjobsA.
2.
125-xipo_archive=[a]-xipo_archive选项使编译器可在生成可执行文件之前,用通过-xipo编译且驻留在归档库(.
a)中的对象文件来优化传递给链接程序的对象文件.
库中包含的在编译期间优化的任何目标文件都会替换为其优化后的版本.
下表列出了a的可能值.
表A–35-xipo_archive标志值含义writeback生成可执行文件之前,编译器使用通过-xipo编译的目标文件(驻留在归档库(.
a)中)来优化传递到链接程序的目标文件.
库中包含的在编译期间优化的任何目标文件都会替换为优化后的版本.
对于使用归档库通用集的并行链接,每个链接都应创建自己的归档库备份,从而在链接前进行优化.
A.
2选项参考附录AC++编译器选项235表A–35-xipo_archive标志(续)值含义readonly生成可执行文件之前,编译器使用通过-xipo编译的目标文件(驻留在归档库(.
a)中)来优化传递到链接程序的目标文件.
通过-xipo_archive=readonly选项,可在链接时指定的归档库中进行目标文件的跨模块内联和程序间数据流分析.
但是,它不启用对归档库代码的跨模块优化,除非代码已经通过跨模块内联插入到其他模块中.
要对归档库内的代码应用跨模块优化,要求-xipo_archive=writeback.
请注意,此设置将修改从中提取代码的归档库的内容.
none这是缺省值.
没有对归档文件的处理.
编译器不对使用-xipo编译和在链接时从归档库中提取的目标文件应用跨模块内联或其他跨模块优化.
要执行此操作,链接时必须指定-xipo,以及-xipo_archive=readonly或-xipo_archive=writeback中的任一个.
如果不为-xipo_archive指定设置,编译器会将其设置为-xipo_archive=none.
指定-xipo_archive时必须带标志.
A.
2.
126-xivdep[=p]禁用或设置#pragmaivdeppragma的解释(忽略向量依赖性).
ivdeppragma指示编译器忽略在循环中找到的部分或全部对数组引用的循环附带依赖性,以进行优化.
这样,编译器就可以执行各种循环优化,例如微向量化、分发、软件流水操作等,其他情况下,无法执行这些优化.
当用户知道这些依赖性无关紧要或者实际上永远不会发生时,可以使用该指令.
#pragmaivdep指令的解释依赖于—xivdep选项的值.
以下列表列出了p的值及其含义.
loop忽略假定的循环附带依赖性loop_any忽略所有循环附带向量依赖性back忽略假定的向后循环附带向量依赖性back_any忽略所有向后循环附带向量依赖性none不忽略任何依赖性(禁用ivdeppragma)提供这些解释是为了与另一个供应商对ivdeppragma的解释兼容.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01236A.
2.
127-xjobs=n指定-xjobs选项设置编译器为完成其工作创建的进程数.
在多处理器计算机上,该选项可以缩短生成时间.
目前,-xjobs只能与-xipo选项一起使用.
如果指定-xjobs=n,过程间优化器就将n作为其在编译不同文件时可调用的最大代码生成器实例数.
A.
2.
127.
1值指定-xjobs时务必要指定值.
否则,会发出错误诊断并使编译终止.
通常,n的安全值等于1.
5乘以可用处理器数.
如果使用的值是可用处理器数的数倍,则会降低性能,因为有在产生的作业间进行的上下文切换开销.
此外,如果使用很大的数值会耗尽系统资源(如交换空间).
A.
2.
127.
2缺省值出现最合适的实例之前,-xjobs的多重实例在命令行上会互相覆盖.
A.
2.
127.
3示例以下示例在有两个处理器的系统上进行的编译,速度比使用相同命令但没有-xjobs选项时进行的编译快.
example%CC-xipo-xO4-xjobs=3t1.
cct2.
cct3.
ccA.
2.
128-xkeepframe[=[%all,%none,name,no%name]]禁止对命名函数(name)进行与堆栈相关的优化.
%all禁止对所有代码进行与堆栈相关的优化.
%none允许对所有代码进行与堆栈相关的优化.
此选项是累积性的,可以多次出现在命令行中.
例如,—xkeepframe=%all—xkeepframe=no%func1表示应保留func1以外的所有函数的堆栈帧.
而且,—xkeepframe优先于—xregs=frameptr.
例如,—xkeepframe=%all—xregs=frameptr表示应保留所有函数的堆栈,但会忽略—xregs=frameptr的优化.
如果命令行中未指定,编译器将采用-xkeepframe=%none作为缺省值.
如果指定了但没有值,编译器将采用-xkeepframe=%allA.
2选项参考附录AC++编译器选项237A.
2.
129-xlang=language[,language]包含适当的运行时库,并确保指定语言的适当运行时环境.
A.
2.
129.
1值language必须是f77、f90、f95或c99.
f90和f95参数等价.
c99参数表示为已使用-xc99=%all编译并要使用CC链接的对象调用ISO9899:1999C编程语言行为.
A.
2.
129.
2交互-xlang=f90和-xlang=f95选项隐含了-library=f90,而-xlang=f77选项隐含了-library=f77.
但要进行混合语言链接,只使用-library=f77和-library=f90选项是不够的,因为只有-xlang选项才能确保适当的运行时环境.
要决定在混合语言链接中使用的驱动程序,请使用下列语言分层结构:1.
C++2.
Fortran95(或Fortran90)3.
Fortran774.
C或C99将Fortran95、Fortran77和C++目标文件链接在一起时,请使用最高级语言的驱动程序.
例如,使用下列C++编译器命令来链接C++和Fortran95目标文件:example%CC-xlang=f95.
.
.
要链接Fortran95和Fortran77目标文件,请使用如下所示的Fortran95驱动程序:example%f95-xlang=f77.
.
.
不能在同一编译器命令中同时使用-xlang选项和-xlic_lib选项.
如果要使用-xlang且需要在Sun性能库中进行链接,应改用-library=sunperf.
A.
2.
129.
3警告请勿将-xnolib与-xlang一起使用.
如果要将并行的Fortran对象与C++对象混合,链接行必须指定-mt标志.
A.
2.
129.
4另请参见-library和-staticlibA.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01238A.
2.
130-xldscope={v}可指定-xldscope选项来更改外部符号定义的缺省链接程序作用域.
由于更好的隐藏了实现,所以对缺省的更改会产生更快速更安全的共享库和可执行文件.
A.
2.
130.
1值下表列出了v的可能值.
表A–36-xldscope值值含义global全局链接程序作用域是限制最少的链接程序作用域.
对符号的所有引用都绑定到定义符号的第一个动态装入模块中的定义.
该链接程序作用域是外部符号的当前链接程序作用域.
symbolic符号链接程序作用域比全局链接程序作用域具有更多的限制.
将对链接的动态装入模块内符号的所有引用绑定到模块内定义的符号.
在模块外部,符号也显示为全局符号.
该链接程序作用域对应于链接程序选项-Bsymbolic.
尽管不能将-Bsymbolic与C++库一起使用,但可以使用-xldscope=symbolic,而不会引起问题.
有关链接程序的更多信息,请参见ld(1)手册页.
hidden隐藏链接程序作用域具有比符号和全局链接程序作用域更高的限制.
将动态装入模块内的所有引用绑定到该模块内的定义.
符号在模块外部是不可视的.
A.
2.
130.
2缺省值如果未指定-xldscope,编译器将假定-xldscope=global.
如果指定了没有任何值的-xldscope,则编译器就会发出错误.
在到达最右边的实例之前,命令行上此选项的多个实例相互覆盖.
A.
2.
130.
3警告如果要使客户端覆盖库中的函数,就必须确保该库生成期间未以内联方式生成该函数.
编译器在以下情况下会内联函数:函数名称是使用-xinline指定的.
如果在-xO4或更高级别进行编译(在这种情况下将自动执行内联).
如果使用内联说明符或交叉文件优化.
例如,假定库ABC具有缺省的分配器函数,该函数可用于库的客户端,也可在库的内部使用:void*ABC_allocator(size_tsize){returnmalloc(size);}A.
2选项参考附录AC++编译器选项239如果在-xO4或更高级别生成库,则编译器将内联库组件中出现的对ABC_allocator的调用.
如果库的客户端要用定制的版本替换ABC_allocator,则在调用ABC_allocator的库组件中不能进行该替换.
最终程序将包括函数的不同版本.
生成库时,用__hidden或__symbolic说明符声明的库函数可以内联生成.
假定这些说明符不被客户机覆盖.
请参见第57页中的"4.
1链接程序作用域".
用__global说明符声明的库函数不应内联声明,并且应该使用-xinline编译器选项来防止内联.
A.
2.
130.
4另请参见-xinline和-xOA.
2.
131-xlibmieee使libm在异常情况下对于数学例程返回IEEE754值.
libm的缺省行为是兼容XPG.
A.
2.
131.
1另请参见《数值计算指南》A.
2.
132-xlibmil内联选定的libm数学库例程以进行优化.
注–该选项不影响C++内联函数.
此选项为libm例程选择内联模板,从而针对当前使用的浮点选项和平台生成执行速度最快的可执行文件.
A.
2.
132.
1交互–fast选项隐含了该选项.
另请参见-fast和《数值计算指南》.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01240A.
2.
133–xlibmopt使用优化的数学例程库.
使用此选项时,必须通过指定-fround=nearest来使用缺省的舍入模式.
此选项使用经过了性能优化的数学例程库,通常情况下,生成的代码运行速度较快.
这样生成的代码可能与普通数学库生成的代码稍有不同,不同之处通常在最后一位上.
该库选项在命令行上的顺序并不重要.
A.
2.
133.
1交互–fast选项隐含了该选项.
A.
2.
133.
2另请参见–fast、–xnolibmopt和-froundA.
2.
134–xlic_lib=sunperf已过时,不使用.
改为指定-library=sunperf.
有关更多信息,请参见第188页中的"A.
2.
49-library=l[,l.
.
.
]".
A.
2.
135–xlicinfo编译器忽略此选项且不显示任何提示.
A.
2.
136-xlinkopt[=level](仅限SPARC)指示编译器在对目标文件进行优化的基础上对生成的可执行文件或动态库执行链接时优化.
这些优化在链接时通过分析二进制目标代码来执行.
虽然未重写目标文件,但生成的可执行代码可能与初始目标代码不同.
必须至少在部分编译命令中使用-xlinkopt,才能使-xlinkopt在链接时有效.
优化器仍可以对未使用-xlinkopt进行编译的二进制目标文件执行部分受限的优化.
-xlinkopt优化出现在编译器命令行上的静态库代码,但会跳过出现在命令行上的共享(动态)库代码而不对其进行优化.
生成共享库时(使用-G进行编译),也可以使用-xlinkopt.
A.
2.
136.
1值级别设置执行的优化级别,必须为0、1或2.
下表列出了优化级别:A.
2选项参考附录AC++编译器选项241表A–37-xlinkopt值值含义0禁用链接优化器(缺省设置).
1在链接时根据控制流分析执行优化,包括指令高速缓存着色和分支优化.
2在链接时执行附加的数据流分析,包括无用代码删除和地址计算简化.
如果在不同的步骤中编译,-xbinopt必须同时出现在编译和链接步骤中:example%cc-c-xlinkopta.
cb.
cexample%cc-omyprog-xlinkopt=2a.
o请注意,仅当编译器链接时才使用级别参数.
在该示例中,即使编译二进制目标文件时使用的是隐含的级别1,链接优化器的级别仍然是2.
A.
2.
136.
2缺省值指定-xlinkopt时若不带级别参数,则表示-xlinkopt=1.
A.
2.
136.
3交互当编译整个程序并且使用分析反馈时,该选项才最有效.
分析功能会展示代码中最常用和最不常用的部分,并指示优化器相应地进行处理.
这对大型应用程序尤为重要,因为在链接时执行代码优化放置可降低指令高速缓存未命中数.
此选项的常见用法如下所示:example%cc-oprogt-xO5-xprofile=collect:progfile.
cexample%progtexample%cc-oprog-xO5-xprofile=use:prog-xlinkoptfile.
c有关使用分析反馈的详细信息,请参见第264页中的"A.
2.
164–xprofile=p".
A.
2.
136.
4警告使用-xlinkopt编译时,请不要使用-zcombreloc链接程序选项.
注意,使用该选项编译会略微延长链接的时间,目标文件的大小也会增加,但可执行文件的大小保持不变.
使用-xlinkopt和-g编译会将调试信息包括在内,从而增加了可执行文件的大小.
A.
2.
137-xloopinfo此选项显示哪些循环是并行化的,通常与-xautopar选项一起使用.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01242A.
2.
138–xM仅对指定的C++程序运行C++预处理程序,请求此预处理程序生成makefile相关项并将结果发送到标准输出.
有关make文件和相关项的详细信息,请参见make(1)手册页.
但是,-xM只报告包含的头文件的依赖性,而不报告关联的模板定义文件的依赖性.
可以使用makefile中的.
KEEP_STATE功能在make实用程序创建的.
make.
state文件中生成所有依赖性.
A.
2.
138.
1示例以下示例:#includevoidmain(void){}生成的输出如下:e.
o:e.
ce.
o:/usr/include/unistd.
he.
o:/usr/include/sys/types.
he.
o:/usr/include/sys/machtypes.
he.
o:/usr/include/sys/select.
he.
o:/usr/include/sys/time.
he.
o:/usr/include/sys/types.
he.
o:/usr/include/sys/time.
he.
o:/usr/include/sys/unistd.
hA.
2.
138.
2交互如果指定-xM和-xMF,编译器会将所有makefile依赖性信息写入使用-xMF指定的文件.
每次预处理程序向此文件写入时即将其覆盖.
A.
2.
138.
3另请参见有关makefile和相关项的详细信息,请参见make(1S)手册页.
A.
2.
139-xM1与–xM一样,生成makefile相关项,只是它不报告/usr/include头文件的相关项,也不报告编译器提供的头文件的相关项.
如果指定-xM1和-xMF,编译器会将所有makefile依赖性信息写入使用-xMF指定的文件.
每次预处理程序向此文件写入时即将其覆盖.
A.
2选项参考附录AC++编译器选项243A.
2.
140-xMD像-xM一样生成makefile依赖性,但编译继续.
-xMD为从-o输出文件名(如果指定)或输入源文件名派生的makefile依赖性信息生成一个输出文件,替换(或添加)后缀为.
d的文件名.
如果指定了-xMD和-xMF,预处理程序会将所有makefile相关项信息写入到使用-xMF指定的文件中.
不允许使用-xMD-xMF或-xMD-ofilename来编译多个源文件,否则会生成错误.
如果已存在依赖性文件,将覆盖该文件.
A.
2.
141-xMF此选项用于指定makefile依赖性输出的文件.
不能在一个命令行上使用-xMF为多个输入文件指定单独的文件名.
不允许使用-xMD-xMF或-xMMD-xMF编译多个源文件,否则会生成错误.
如果已存在依赖性文件,将覆盖该文件.
A.
2.
142-xMMD此选项用于生成不包含系统头文件的makefile依赖性.
此选项提供的功能与-xM1的功能相同,但是编译会继续.
-xMMD为从-o输出文件名(如果指定)或输入源文件名派生的makefile相关项信息生成一个输出文件,替换(或添加)后缀为.
d的文件名.
如果您指定-xMF,则编译器将改用您提供的文件名.
不允许使用-xMMD-xMF或-xMMD-ofilename来编译多个源文件,否则会生成错误.
如果已存在依赖性文件,将覆盖该文件.
A.
2.
143–xMerge(仅限SPARC)将数据段和文本段合并.
目标文件中的数据是只读数据,并在进程之间共享,除非使用ld-N进行链接.
三个选项-xMerge-ztext-xprofile=collect不应同时使用.
-xMerge会强制将静态初始化的数据存储到只读存储器中,-ztext禁止在只读存储器中进行依赖于位置的符号重定位,而-xprofile=collect会在可写存储器中生成静态初始化的、依赖于位置的符号重定位.
A.
2.
143.
1另请参见ld(1)手册页A.
2.
144-xmaxopt[=v]此选项将pragmaopt的级别限制为指定级别.
v可以为off、1、2、3、4或5.
缺省值为-xmaxopt=off,表示忽略pragmaopt.
在不带参数的情况下指定-xmaxopt时,缺省为-xmaxopt=5.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01244如果同时指定了-xO和-xmaxopt,则使用-xO设置的优化级别不得超过-xmaxopt值.
A.
2.
145-xmemalign=ab(仅限SPARC)使用-xmemalign选项控制编译器对数据对齐所做的假定.
通过控制可能会出现非对齐内存访问的代码和出现非对齐内存访问时的处理程序,可以更轻松的将程序移植到SPARC.
指定最大假定内存对齐和非对齐数据访问的行为.
必须同时为a(对齐)和b(行为)提供值.
a指定最大假定内存对齐,b指定未对齐内存访问行为.
对于可在编译时确定对齐的内存访问,编译器会为该数据对齐生成适当的装入/存储指令序列.
对于不能在编译时确定对齐的内存访问,编译器必须假定一个对齐以生成所需的装入/存储序列.
如果运行时的实际数据对齐小于指定的对齐,则未对齐的访问尝试(内存读取或写入)生成一个陷阱.
对陷阱的两种可能响应是:操作系统将陷阱转换为SIGBUS信号.
如果程序无法捕捉到信号,则程序终止.
即使程序捕捉到信号,未对齐的访问尝试仍将无法成功.
操作系统通过翻译未对齐的访问并将控制返回给程序(仿佛访问已成功正常结束)来处理陷阱.
A.
2.
145.
1值下面列出了-xmemalign的对齐值和行为值.
a的值:1假定最多1字节对齐.
2假定最多2字节对齐.
4假定最多4字节对齐.
8假定最多8字节对齐.
16假定最多16字节对齐.
b的值:i解释访问并继续执行.
s产生信号SIGBUS.
f对于64位SPARC体系结构:为小于或等于4的对齐产生信号SIGBUS.
否则,将解释访问并继续执行.
A.
2选项参考附录AC++编译器选项245对于所有其他的体系结构,此标志等效于i.
如果要链接到某个已编译的目标文件,并且编译该目标文件时b的值设置为i或f,就必须指定-xmemalign.
有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见第43页中的"3.
3.
3编译时选项和链接时选项".
A.
2.
145.
2缺省值以下缺省值仅适用于未使用-xmemalign选项时:-xmemalign=8i,适用于所有32位SPARC体系结构(-m32)-xmemalign=8s,适用于所有64位SPARC体系结构(-m64)在提供了-xmemalign选项但未指定值时,缺省值为:-xmemalign=1i,适于所有体系结构.
A.
2.
145.
3示例下面说明了如何使用-xmemalign来处理不同的对齐情况.
-xmemalign=1s所有内存访问均未对齐,从而导致陷阱处理非常慢.
-xmemalign=8i在其他情况下正确的代码中可能会发生偶然的、有目的的、未对齐访问.
-xmemalign=8s程序中未发生任何未对齐访问.
-xmemalign=2s要检查可能存在的奇字节访问.
-xmemalign=2i要检查可能存在的奇字节访问并要使程序工作.
A.
2.
146-xmodel=[a](仅限x86)-xmodel选项使编译器可以针对OracleSolarisx86平台修改64位对象形式,只应在要编译此类对象时指定该选项.
仅当启用了64位的x64处理器上还指定了-m64时,该选项才有效.
下表列出了a的可能值.
表A–38-xmodel标志值含义small此选项可为小模型生成代码,其中执行代码的虚拟地址在链接时已知,并且已知在0到2^31-2^24-1的虚拟地址范围内可以找到所有符号.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01246表A–38-xmodel标志(续)值含义kernel按内核模型生成代码,在该模型中,所有符号都定义在2^64-2^31到2^64-2^24范围内.
medium按中等模型生成代码,在该模型中,不对数据段的符号引用范围进行假定.
文本段的大小和地址的限制与小型代码模型的限制相同.
使用-m64编译时,具有大量静态数据的应用程序可能会要求-xmodel=medium.
此选项不累积,因此编译器根据命令行最右侧的-xmodel实例设置模型值.
如果未指定-xmodel,编译器将假定-xmodel=small.
如果指定没有参数的-xmodel,将出现错误.
不是编译所有转换单元时都需要使用此选项.
只有可以确保访问的对象在可访问范围之内,才可编译选择的文件.
您应了解,不是所有的Linux系统都支持中等模型.
A.
2.
147–xnolib禁用与缺省系统库链接.
通常(不含该选项)情况下,C++编译器会链接多个系统库以支持C++程序.
使用该选项时,用于链接缺省系统支持库的-llib不会传递给ld.
通常情况下,编译器按照以下顺序链接系统支持库:使用缺省的—compat=5时,库为:-lCstd-lCrun-lm-lc对于Linux上的—compat=g,库为:—lstdc++—lCrunG3—lm—lc对于Oraclex86上的—compat=g,库为:—lstdc++—lgcc_s—lCrunG3—lm—lc-l选项的顺序非常重要.
-lm选项必须位于-lc之前.
注–如果指定了-mt编译器选项,编译器通常先与-lthread链接,然后再与-lm链接.
要确定在缺省情况下将链接哪些系统支持库,请使用-dryrun选项进行编译.
例如,以下命令的输出:example%CCfoo.
cc-m64-dryrunA.
2选项参考附录AC++编译器选项247在输出中显示以下内容:-lCstd-lCrun-lm-lcA.
2.
147.
1示例对于符合C应用程序二进制接口的基本编译(即只需要支持C的C++程序),请使用以下命令:example%CC-xnolibtest.
cc–lc要将libm静态链接到具有通用体系结构指令集的单线程应用程序中,请使用以下命令:example%CC-xnolibtest.
cc-lCstd-lCrun-Bstatic-lm-Bdynamic-lcA.
2.
147.
2交互如果指定了–xnolib,就必须按给定顺序手动链接所有必需的系统支持库.
必须最后链接系统支持库.
如果指定了-xnolib,则忽略-library.
A.
2.
147.
3警告许多C++语言功能都要求使用libCrun(标准模式).
系统支持库的集合不稳定,会因不同的发行版本而更改.
A.
2.
147.
4另请参见–library、–staticlib和–lA.
2.
148–xnolibmil在命令行上取消–xlibmil.
将该选项与–fast一起使用会忽略与优化数学库链接.
A.
2.
149–xnolibmopt不使用数学例程库.
A.
2.
149.
1示例在命令行上–fast选项后面使用该选项,如下例中所示:example%CC–fast–xnolibmoptA.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01248A.
2.
150-xnorunpath与第194页中的"A.
2.
60–norunpath"相同A.
2.
151-xOlevel指定优化级别,请注意是大写字母O后跟数字1、2、3、4或5.
通常,程序执行速度取决于优化的级别.
优化级别越高,运行时性能越好.
不过,较高的优化级别会延长编译时间并生成较大的可执行文件.
在少数情况下,-xO2级别的性能可能比其他优化级别好,而-xO3也可能胜过-xO4.
尝试用每个级别进行编译,以查看您是否会遇到这种少见的情况.
如果优化器运行时内存不足,则会尝试在较低的优化等级上重试当前过程来恢复.
优化器会以在–xOlevel选项中指定的初始级别恢复执行后续过程.
以下几节介绍了在SPARC平台和x86平台上这五个-xOlevel优化级别如何运行.
A.
2.
151.
1值在SPARC平台上:–xO1只执行最小量的优化(peephole),也称为postpass,即汇编级优化.
除非使用-xO2或-xO3导致编译时间过长,或交换空间不足,否则请勿使用-xO1.
–xO2执行基本的局部和全局优化,包括:归纳变量消除局部和全局的通用子表达式消除代数运算简化复制传播常量传播非循环变体优化寄存器分配基本块合并尾部递归消除终止代码消除尾部调用消除复杂表达式扩展该级别不优化外部变量或间接变量的引用或定义.
A.
2选项参考附录AC++编译器选项249–xO3除了执行在–xO2级别所执行的优化外,还会对外部变量的引用和定义进行优化.
该级别不跟踪指针赋值的结果.
编译未通过volatile适当保护的设备驱动程序或修改来自信号处理程序中的外部变量的程序时,请使用-xO2.
通常,使用此级别时会增加代码大小,除非将其与-xspace选项结合使用.
–xO4除了执行–xO3优化外,还自动内联同一文件中的多个函数.
自动内联通常会提高执行速度,但有时却会使速度变得更慢.
通常,使用此级别时会增加代码大小,除非将其与-xspace选项结合使用.
–xO5生成最高级别的优化.
它只适用于占用大量计算机时间的小部分程序.
该级别采用了占用更多编译时间或无法在某种程度上减少执行时间的优化算法.
如果使用分析反馈执行该级别上的优化,则更容易提高性能.
请参见第264页中的"A.
2.
164–xprofile=p".
在x86平台上:–xO1执行基本优化.
其中包括代数运算简化、寄存器分配、基本块合并、终止代码和存储消除以及peephole优化.
–xO2执行局部通用子表达式消除、局部复制和常量传播、尾部递归消除以及级别1执行的优化.
–xO3执行全局通用子表达式的消除、全局复制和常量传播、循环长度约简、归纳变量消除、循环变体优化以及级别2执行的优化.
–xO4会自动内联同一文件中的多个函数,并执行级别为3时执行的优化.
自动内联通常会提高执行速度,但有时却会使速度变得更慢.
该级别还释放了通用的框架指针注册(ebp).
通常该级别会增加代码的大小.
–xO5生成最高级别的优化.
该级别采用了占用更多编译时间或无法在某种程度上减少执行时间的优化算法.
A.
2.
151.
2交互如果使用-g或-g0且优化级别是-xO3或更低,编译器会为近乎完全优化提供尽可能多的符号信息.
如果使用-g或-g0且优化级别是-xO4或更高,编译器会为完全优化提高尽可能多的符号信息.
使用-g进行调试不会抑制–xOlevel,但–xOlevel会对–g造成一些限制.
例如,–xOlevel选项会降低调试的作用,因此无法显示dbx中的变量,但仍可使用dbxwhere命令获取符号回溯.
有关更多信息,请参见《使用dbx调试程序》.
-xipo选项只有与-xO4或-xO5一起使用时才有效.
优化级别低于-xO3时,-xinline选项不起作用.
优化级别为-xO4时,优化器会决定应该内联哪些函数,而不管是否指定了-xinline选项.
优化级别为-xO4时,编译器还会尝试确定内联哪些函数可以提高性能.
如果使用-xinline强制内联函数,实际上可能会降低性能.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01250A.
2.
151.
3缺省值缺省为不优化.
不过,只有不指定优化级别时才可能使用缺省设置.
如果指定了优化级别,则没有任何选项可用来关闭优化.
如果尝试不设置优化级别,请不要指定任何隐含优化级别的选项.
例如,-fast是将优化级别设置为-xO5的宏选项.
隐含优化级别的所有其他选项都会发出优化已设置的警告消息.
不使用任何优化来编译的方法是从命令行删除所有选项或创建指定优化级别的文件.
A.
2.
151.
4警告如果在–xO3或–xO4级别上优化多个非常大的过程(一个过程有数千行代码),优化器会需要过多内存.
在这些情况下,机器的性能就会降低.
为了防止性能降低,请使用limit命令限制单一进程可用的虚拟内存大小.
请参见csh(1)手册页.
例如,将虚拟内存限制为4GB:example%limitdatasize4G如果它达到4GB的数据空间,该命令会使优化器尝试恢复.
限制不能大于机器总的可用交换空间,而且要足够的小以允许在大型编译的过程中机器可以正常使用.
数据大小的最佳设置取决于要求的优化程度、真实内存和可用虚拟内存的大小.

要查找实际的交换空间,请输入:swap–l要查找实际的真实内存,请输入:dmesg|grepmemA.
2.
151.
5另请参见-xldscope–fast、–xprofile=p和csh(1)手册页A.
2.
152-xopenmp[=i]使用-xopenmp选项可通过OpenMP指令进行显式并行化.
A.
2.
152.
1值下表列出了i的值.
A.
2选项参考附录AC++编译器选项251表A–39-xopenmp值值含义parallel启用OpenMPpragma的识别.
在-xopenmp=parallel时,最低优化级别是-xO3.
如有必要,编译器将优化级别从较低级别更改为-xO3,并发出警告.
此标志还定义处理器标记_OPENMP.
noopt启用OpenMPpragma的识别.
如果优化级别低于-O3,编译器将不会提高优化级别.
如果显式将优化级别设置为低于-O3(如CC-O2-xopenmp=noopt),编译器会发出错误.
如果没有使用-xopenmp=noopt指定优化级别,则会识别OpenMPpragma,并相应地对程序进行并行处理,但不进行优化.
此标志还定义处理器标记_OPENMP.
none此标志是缺省标志,它禁止识别OpenMPpragma.
它不更改编译的优化级别,也不预定义任何预处理程序标记.
A.
2.
152.
2缺省值如果未指定-xopenmp,则编译器缺省使用-xopenmp=none.
如果指定了不带参数的-xopenmp,则编译器缺省使用-xopenmp=parallel.
A.
2.
152.
3交互如果使用dbx调试OpenMP程序,那么编译时选用-g和-xopenmp=noopt可以在并行区设置断点并显示变量内容.
使用OMP_NUM_THREADS环境变量可指定在运行OpenMP程序时要使用的线程数.
如果未设置OMP_NUM_THREADS,则缺省使用的线程数为2.
要使用多个线程,请将OMP_NUM_THREADS设置为更大的值.
将OMP_NUM_THREADS设置为1,则会仅使用一个线程运行.
通常情况下,将OMP_NUM_THREADS设置为运行系统上可用的虚拟处理器数,该值可使用OracleSolarispsrinfo(1)命令确定.
有关更多信息,请参见《OracleSolarisStudioOpenMPAPI用户指南》.
要启用嵌套并行操作,必须将OMP_NESTED环境变量设置为TRUE.
缺省情况下,禁用嵌套并行操作.
有关详细信息,请参见《OracleSolarisStudioOpenMPAPI用户指南》.
A.
2.
152.
4警告在以后的发行版中,-xopenmp的缺省值可能会更改.
可以通过显式指定适当的优化来避免警告消息.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01252如果在不同的步骤中进行编译和链接,请在编译步骤和链接步骤中都指定-xopenmp.
如果要生成共享对象,这很重要.
用于编译可执行文件的编译器的版本不得比使用-xopenmp生成.
so的编译器低.
这在编译包含OpenMP指令的库时尤其重要.
有关在编译时和链接时都必须指定的选项的完整列表,请参见第43页中的"3.
3.
3编译时选项和链接时选项".
为了取得最佳的性能,请确保在系统上安装了最新的OpenMP运行时库libmtsk.
so.
A.
2.
152.
5另请参见有关用于生成多重处理应用程序的OpenMPFortran95、C和C++应用程序接口(applicationprograminterface,API)的完整摘要,请参见《OracleSolarisStudioOpenMPAPI用户指南》.
A.
2.
153-xpagesize=n为堆栈和堆设置首选页面大小.
A.
2.
153.
1值在SPARC上有效值包括:4K、8K、64K、512K、2M、4M、32M、256M、2G、16G或default.
在x86/x64上有效值包括:4K、2M、4M、1G或default.
必须指定适于目标平台的有效页面大小.
如果不指定有效的页面大小,运行时将忽略该请求,且不显示任何提示.
在OracleSolaris操作系统中使用getpagesize(3C)命令可以确定页面中的字节数.
Solaris操作系统不保证支持页面大小请求.
可以使用pmap(1)或meminfo(2)来确定目标平台的页面大小.
注–使用该选项进行编译与使用等效的选项将LD_PRELOAD环境变量设置为mpss.
so.
1,或在运行程序之前使用等效的选项运行OracleSolaris命令ppgsz(1)具有相同的效果.
有关详细信息,请参见OracleSolaris手册页.
A.
2.
153.
2缺省值如果指定-xpagesize=default,OracleSolaris操作系统将设置页面大小.
A.
2.
153.
3扩展此选项是用于-xpagesize_heap和-xpagesize_stack的宏.
这两个选项与-xpagesize接受相同的参数:4k、8K、64K、512K、2M、4M、32M、256M、2G、16G或default.
可以通过指定-xpagesize为它们设置相同值,也可以分别为它们指定不同的值.
A.
2选项参考附录AC++编译器选项253A.
2.
153.
4警告除非在编译和链接时使用,否则-xpagesize选项不会生效.
有关在编译时和链接时都必须指定的选项的完整列表,请参见第43页中的"3.
3.
3编译时选项和链接时选项".
A.
2.
154-xpagesize_heap=n为堆设置内存页面大小.
A.
2.
154.
1值n可以是4k、8K、64K、512K、2M、4M、32M、256M、2G、16G或default.
必须指定适于目标平台的有效页面大小.
如果不指定有效的页面大小,运行时将忽略该请求,且不显示任何提示.
在OracleSolaris操作系统中使用getpagesize(3C)命令可以确定页面中的字节数.
Solaris操作系统不保证支持页面大小请求.
可以使用pmap(1)或meminfo(2)来确定目标平台的页面大小.
注–使用该选项进行编译与使用等效的选项将LD_PRELOAD环境变量设置为mpss.
so.
1,或在运行程序之前使用等效的选项运行OracleSolaris命令ppgsz(1)具有相同的效果.
有关详细信息,请参见OracleSolaris手册页.
A.
2.
154.
2缺省值如果指定-xpagesize_heap=default,OracleSolaris操作系统将设置页面大小.
A.
2.
154.
3警告除非在编译和链接时使用,否则-xpagesize_heap选项不会生效.
A.
2.
155-xpagesize_stack=n为堆栈设置内存页面大小.
A.
2.
155.
1值n可以是4k、8K、64K、512K、2M、4M、32M、256M、2G、16G或default.
必须指定适于目标平台的有效页面大小.
如果不指定有效的页面大小,运行时将忽略该请求,且不显示任何提示.
在OracleSolaris操作系统中使用getpagesize(3C)命令可以确定页面中的字节数.
OracleSolaris操作系统不保证支持页面大小请求.
可以使用pmap(1)或meminfo(2)来确定目标平台的页面大小.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01254注–使用该选项进行编译与使用等效的选项将LD_PRELOAD环境变量设置为mpss.
so.
1,或在运行程序之前使用等效的选项运行OracleSolaris命令ppgsz(1)具有相同的效果.
有关详细信息,请参见OracleSolaris手册页.
A.
2.
155.
2缺省值如果指定-xpagesize_stack=default,OracleSolaris操作系统将设置页面大小.
A.
2.
155.
3警告除非在编译和链接时使用,否则-xpagesize_stack选项不会生效.
A.
2.
156-xpch=v该编译器选项激活了预编译头文件特性.
预编译头文件的作用是减少源代码共享同一组include文件的应用程序的编译时间,而且这些include文件往往包含大量的源代码.
编译器首先从一个源文件收集一组头文件信息,然后在重新编译该源文件或者其他有同样头文件的源文件时就可以使用这些收集到的信息.
编译器收集的信息存储在预编译头文件中.
要使用该功能,需要指定-xpch和-xpchstop选项,并使用#pragmahdrstop指令.
A.
2.
156.
1创建预编译头文件指定-xpch=v时,v可以是collect:pch-filename或use:pch-filename.
首次使用-xpch时,必须指定collect模式.
指定-xpch=collect的编译命令只能指定一个源文件.
在以下示例中,-xpch选项根据源文件a.
cc创建名为myheader.
Cpch的预编译头文件:CC-xpch=collect:myheadera.
cc有效的预编译头文件总是有后缀.
Cpch.
在指定pch-filename时,您可以自己添加后缀,也可以让编译器为您添加.
例如,如果指定cc-xpch=collect:fooa.
cc,则预编译头文件称为foo.
Cpch.
在创建预编译头文件时,请选取包含所有源文件之间include文件通用序列的源文件,预编译头文件与这些源文件一起使用.
include文件的共同序列在这些源文件之间必须是一样的.
请记住,在collect模式中只能使用一个源文件名值.
例如,CC-xpch=collect:foobar.
cc有效,而CC-xpch=collect:foobar.
ccfoobar.
cc无效,因为它指定了两个源文件.
使用预编译头文件可指定-xpch=use:pch-filename以使用预编译头文件.
您可以将include文件同一序列中任意数量的源文件指定为用于创建预编译头文件的源文件.
例如,在use模式中命令类似于:CC-xpch=use:foo.
Cpchfoo.
cbar.
ccfoobar.
cc.
A.
2选项参考附录AC++编译器选项255如果以下条件都成立,则只能使用现有的预编译的头文件.
如果以下任意条件不成立,则应重新创建预编译头文件:用于访问预编译头文件的编译器与创建预编译头文件的编译器相同.
编译器的一个版本创建的预编译头文件可能无法用于另一版本(包括安装的修补程序产生的差异).
除-xpch选项之外,用-xpch=use指定的编译器选项必须与创建预编译头文件时指定的选项相匹配.
用-xpch=use指定的包含头文件的集合与创建预编译头文件时指定的头文件集合是相同的.
用-xpch=use指定的包含头文件的内容与创建预编译头文件时指定的包含头文件的内容是相同的.
当前目录(即发生编译并尝试使用给定预编译头文件的目录)与创建预编译头文件所在的目录相同.
在用-xpch=collect指定的文件中预处理指令(包括#include)的初始序列,与在用-xpch=use指定的文件中预处理指令的序列相同.
要在多个源文件间共享预编译头文件,这些源文件必须共享一组共同的include文件(按其初始标记序列).
该初始标记序列称为活前缀.
活前缀必须在使用相同预编译头文件的所有源文件中解释一致.
源文件的活前缀只能包含注释和以下任意预处理程序指令:#include#if/ifdef/ifndef/else/elif/endif#define/undef#ident(ifidentical,passedthroughasis)#pragma(ifidentical)以上任何指令都可以引用宏.
#else、#elif和#endif指令必须在活前缀内匹配.
在共享预编译头文件的每个文件的活前缀中,每个相应的#define和#undef指令都必须引用相同的符号.
例如,每个#define必须引用同一个值.
这些指令在每个活前缀中出现的顺序也必须相同.
每个相应pragma也必须相同,并且必须按相同顺序出现在共享预编译头文件的所有文件中.
并入预编译头文件的头文件不得违反以下约束.
这里没有定义对违反上述约束的程序的编译结果.
头文件一定不要包含函数和变量定义.
头文件不得使用__DATE__和__TIME__.
使用预处理宏会产生无法预料的结果.
头文件不得包含#pragmahdrstop.
头文件的活前缀中不得使用__LINE__和__FILE__.
可以在包含的头文件中使用__LINE__和__FILE__.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01256如何修改makefile本节介绍了为将-xpch合并到生成的程序中而对makefile进行修改的几种可能方法.
可以通过使用辅助变量CCFLAGS以及make和dmake的KEEP_STATE功能使用隐式make规则.
预编译头文件是在独立的步骤中生成的.
.
KEEP_STATE:CCFLAGS_AUX=-OetcCCFLAGS=-xpch=use:shared$(CCFLAGS_AUX)shared.
Cpch:foo.
cc$(CCC)-xpch=collect:shared$(CCFLAGS_AUX)foo.
cca.
out:foo.
oping.
opong.
o$(CCC)foo.
oping.
opong.
o您还可以定义自己的编译规则,而无不是尝试使用辅助变量CCFLAGS.
.
KEEP_STATE:.
SUFFIXES:.
o.
cc%.
o:%.
ccshared.
Cpch$(CCC)-xpch=use:shared$(CCFLAGS)-c$#include#include"projectheader.
h"#include"privateheader.
h".
.
.
example%CC-xpch=collect:foo.
Cpcha.
cc-xpchstop=projectheader.
h-cA.
2.
157.
1另请参见-xpch和pragmahdrstopA.
2.
158-xpec[={yes|no}](仅限Solaris)生成可移植的可执行代码(PortableExecutableCode,PEC)库.
此选项将程序中间表示置于目标文件和二进制文件中.
该二进制文件可在以后用于调整和故障排除.
使用-xpec生成的二进制文件通常会比未使用-xpec生成的二进制文件大五到十倍.
如果不指定-xpec,则编译器会将其设置为-xpec=no.
如果您指定-xpec,但不提供标志,则编译器会将其设置为-xpec=yes.
A.
2.
159–xpg编译以便使用gprof分析器进行分析.
-xpg选项可编译自分析代码,以便收集可使用gprof分析的数据.
该选项调用运行时记录机制,该机制会在程序正常终止时生成gmon.
out文件.
注–如果指定了-xpg,则-xprofile将没什么用处.
两者不能准备或使用对方提供的数据.
在64位Solaris平台上,使用prof(1)或gprof(1)生成分析,在32位Solaris平台上,则只使用gprof生成分析,分析中包含大概的用户CPU时间.
这些时间来自主可执行文件中的例程以及共享库中例程(链接可执行文件时将共享库指定为链接程序参数)的PC样例数据.
其他共享库(在进程启动后使用dlopen(3DL)打开的库)不进行分析.
在32位Solaris系统中,使用prof(1)生成的分析仅限于可执行文件中的例程.
32位共享库通过用-xpg和gprof(1)链接可执行程序可以进行分析.
在x86系统中,-xpg与-xregs=frameptr不兼容,这两个选项不应一起使用.
还请注意,-fast中包括-xregs=frameptr.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01258OracleSolaris10软件不包括使用-p编译的系统库.
因此,在Solaris10平台上收集的分析不包含系统库例程的调用计数.
A.
2.
159.
1警告如果分别进行编译和链接,且使用–xpg进行编译,应确保使用–xpg进行链接.
有关在编译时和链接时都必须指定的选项的完整列表,请参见第43页中的"3.
3.
3编译时选项和链接时选项".
使用-xpg编译以便进行gprof分析的二进制文件不应与binopt(1)一起使用,因为它们不兼容并可能导致内部错误.
A.
2.
159.
2另请参见–xprofile=p、analyzer(1)手册页和性能分析器手册.
A.
2.
160-xport64[=(v)]使用此选项可以帮助调试要移植到64位环境的代码.
具体来说,该选项会针对遇到的问题发出警告,例如:类型(包括指针)的截断,符号扩展以及位包装更改,将代码从诸如V8的32位体系结构移植到诸如V9的64位体系结构时经常会遇到这些问题.
除非您也在64位模式(—m64)下进行编译,否则此选项没有任何效果.
A.
2.
160.
1值下表列出了v的有效值:表A–40-xport64值值含义no将代码从32位环境移植到64位环境时,不会生成与该代码移植有关的任何警告.
implicit只生成隐式转换的警告.
显式强制类型转换出现时不生成警告.
full将代码从32位环境移植到64位环境时,生成了与该代码移植有关的所有警告.
其中包括对64位值的截断警告、根据ISO值的保存规则对64位的符号扩展,以及对位字段包装的更改.
A.
2.
160.
2缺省值如果未指定-xport64,则缺省值为-xport64=no.
如果指定了-xport64但未指定标志,则缺省值为-xport64=full.
A.
2.
160.
3示例本节提供了可以导致类型截断、符号扩展和对位包装更改的代码示例.

A.
2选项参考附录AC++编译器选项259检查64位值的截断在移植到诸如SPARCV9的64位体系结构时,数据可能会被截断.
截断可能会因赋值(初始化时)或显式强制类型转换而隐式地发生.
两个指针的差异在于typedefptrdiff_t,它在32位模式下是32位整型,而在64位模式下是64位整型.
将较长的整型截断为较小的整型会生成警告,如下示例所示.
example%cattest1.
cintx[10];intdiff=&x[10]-&x[5];//warnexample%CC-c-m64-Qoptionccfe-xport64=fulltest1.
c"test1.
c",line3:Warning:Conversionof64-bittypevalueto"int"causestruncation.
1Warning(s)detected.
example%可使用-xport64=implicit禁用64位编译模式下显式强制类型转换导致数据截断时出现截断警告.
example%CC-c-m64-Qoptionccfe-xport64=implicittest1.
c"test1.
c",line3:Warning:Conversionof64-bittypevalueto"int"causestruncation.
1Warning(s)detected.
example%在移植到64位架构过程中出现的另一个常见问题是指针的截断.
该问题在C++中始终是错误.
如果指定了-xport64,导致此类截断的操作(如将指针强制转换为整型)可能会导致在64位SPARC体系结构中出现错误诊断.
example%cattest2.
cchar*p;intmain(){p=(char*)(((unsignedint)p)&0xFF);//-m64errorreturn0;}example%CC-c-m64-Qoptionccfe-xport64=fulltest2.
c"test2.
c",line3:Error:Cannotcastfromchar*tounsigned.
1Error(s)detected.
example%检查符号扩展还可以使用-xport64选项来检查这种情况:标准ISOC值保留规则允许在无符号整型的表达式中进行带符号整数值的符号扩展.
这种符号扩展会产生细微的运行时错误.

example%cattest3.
cinti=-1;voidpromo(unsignedlongl){}intmain(){unsignedlongl;l=i;//warnpromo(i);//warnA.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01260}example%CC-c-m64-Qoptionccfe-xport64=fulltest3.
c"test3.
c",line6:Warning:Signextensionfrom"int"to64-bitinteger.
"test3.
c",line7:Warning:Signextensionfrom"int"to64-bitinteger.
2Warning(s)detected.
检查位字段包装的更改可使用-xport64生成对长位字段的警告.
出现这种位字段时,位字段的包装可能会显著更改.
在成功移植到64位架构之前,依赖于假定的任何程序都需要重新检查,该假定与包装位字段的方法有关.
example%cattest4.
c#includeunionU{structS{unsignedlongb1:20;unsignedlongb2:20;}s;longbuf[2];}u;intmain(){u.
s.
b1=0XFFFFF;u.
s.
b2=0XFFFFF;printf("u.
buf[0]=%lxu.
buf[1]=%lx\n",u.
buf[0],u.
buf[1]);return0;}example%64位SPARC系统(-m64)上的输出:example%u.
buf[0]=ffffffffff000000u.
buf[1]=0A.
2.
160.
4警告请注意,仅当使用-m64以64位模式编译时,才会生成警告.
A.
2.
160.
5另请参见第191页中的"A.
2.
50-m32|-m64"A.
2.
161-xprefetch[=a[,a.
.
.
]]在支持预取的体系结构上启用预取指令.
显式预取只应在度量支持的特殊环境下使用.
下表列出了a的可能值.
A.
2选项参考附录AC++编译器选项261表A–41-xprefetch值值含义auto启用预取指令的自动生成no%auto禁用预取指令的自动生成explicit(SPARC)启用显式预取宏no%explicit(SPARC)禁用显式预取宏latx:factor根据指定的因子,调整编译器假定的"预取到装入"和"预取到存储"延迟.
只能将此标志与-xprefetch=auto结合使用.
该因子必须是正浮点数或整数.
yes已废弃,不使用.
改用-xprefetch=auto,explicit.
no已废弃,不使用.
改用-xprefetch=no%auto,no%explicit.
使用-xprefetch和-xprefetch=auto时,编译器就可以将预取指令自由插入到它生成的代码中.
该操作会提高支持预取的体系结构的性能.
如果是在大型多处理器上运行计算密集型代码,则使用-xprefetch=latx:factor可以提高性能.
该选项指示代码生成器按照指定的因子调节在预取及其相关的装入或存储之间的缺省延迟时间.
预取延迟是从执行预取指令到所预取的数据在高速缓存中可用那一刻之间的硬件延迟.
在确定发出预取指令到发出使用所预取数据的装入或存储指令之间的间隔时,编译器就采用预取延迟值.
注–在预取和装入之间采用的延迟可能与在预取和存储之间采用的延迟不同.

编译器可以在众多计算机与应用程序间调整预取机制,以获得最佳性能.
这种调整并非总能达到最优.
对于占用大量内存的应用程序,尤其是要在大型多处理器上运行的应用程序,可以通过增加预取延迟值来提高性能.
要增加值,请使用大于1的因子.
介于.
5和2.
0之间的值最有可能提供最佳性能.
对于数据集完全位于外部高速缓存中的应用程序,可以通过减小预取延迟值来提高性能.
要减小值,请使用小于1的因子.
要使用-xprefetch=latx:factor选项,请首先使用接近1.
0的因子值并对应用程序运行性能测试.
然后适当增加或减小该因子,并再次运行性能测试.
继续调整因子并运行性能测试,直到获得最佳性能.
以很小的增量逐渐增加或减小因子时,前几步中不会看到性能差异,之后会突然出现差异,然后再趋于稳定.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01262A.
2.
161.
1缺省值缺省值为-xprefetch=auto,explicit.
此缺省值会对实质上具有非线性内存访问模式的应用程序造成负面影响.
要覆盖该缺省值,请指定-xprefetch=no%auto,no%explicit.
除非使用参数no%auto或参数no进行显式覆盖,否则使用缺省值auto.
例如,-xprefetch=explicit与-xprefetch=explicit,auto相同.
除非使用参数no%explicit或no进行显式覆盖,否则使用缺省值explicit.
例如,-xprefetch=auto与-xprefetch=auto,explicit相同.
如果仅指定了-xprefetch,则假定为-xprefetch=auto,explicit.
如果启用了自动预取,但未指定延迟因子,则假定-xprefetch=latx:1.
0.
A.
2.
161.
2交互该选项会累积而不覆盖.
sun_prefetch.
h头文件提供了用于指定显式预取指令的宏.
这些预取可能位于对应于宏出现位置的可执行文件中.
要使用显式预取指令,必须在适当的体系结构上,将sun_prefetch.
h包含进来,并且从编译器命令中排除-xprefetch或者使用-xprefetch、-xprefetch=auto,explicit或-xprefetch=explicit.
如果调用宏并包含sun_prefetch.
h头文件,但指定-xprefetch=no%explicit,那么显式预取将不会出现在可执行文件中.
仅当启用了自动预取时,使用latx:factor才有效.
除非将latx:factor与-xprefetch=auto,latx:factor一起使用,否则它会被忽略.
A.
2.
161.
3警告显式预取只应在度量支持的特殊环境下使用.
因为编译器可以在众多计算机与应用程序间调整预取机制以获得最佳性能,所以仅当性能测试指示性能明显提高时,才应当使用-xprefetch=latx:factor.
假定的预取延迟在不同发行版本中是不同的.
因此,无论何时切换到不同的发行版本,强烈建议重新测试延迟因子对性能的影响.
A.
2.
162-xprefetch_auto_type=a其中,a是[no%]indirect_array_access.
使用此选项可以确定编译器是否以为直接内存访问生成预取的方式,为由选项-xprefetch_level指示的循环生成间接预取.
A.
2选项参考附录AC++编译器选项263如果不指定-xprefetch_auto_type的设置,编译器会将其设置为-xprefetch_auto_type=no%indirect_array_access.
-xdepend、-xrestrict和-xalias_level等选项会影响计算候选间接预取的主动性,进而影响因更好的内存别名歧义消除信息而自动插入间接预取的主动性.

A.
2.
163-xprefetch_level[=i]可使用-xprefetch_level=i选项控制由-xprefetch=auto确定的自动插入预取指令的主动性.
编译器变得更加主动,也就是说,引入更多预取级别-xprefetch_level(依次增高).
-xprefetch_level取何适当值取决于应用程序的高速缓存未命中次数.
-xprefetch_level值越高,越有可能提高那些高速缓存未命中次数较多的应用程序的性能.
A.
2.
163.
1值i必须是1、2或3,如下表所示.
表A–42-xprefetch_level值值含义1启用预取指令的自动生成.
2针对其他循环(超过在-xprefetch_level=1针对的循环)来插入预取.
插入的其他预取可能超过在-xprefetch_level=1插入的预取.
3针对其他循环(超过在-xprefetch_level=2针对的循环)来插入预取.
插入的其他预取可能超过在-xprefetch_level=2插入的预取.
A.
2.
163.
2缺省值指定了-xprefetch=auto时,缺省值为-xprefetch_level=1.
A.
2.
163.
3交互仅当使用-xprefetch=auto对该选项进行编译,优化级别为3或更高(-xO3),而且是在支持预取的64位SPARC平台(-m64)上时,该选项才有效.
A.
2.
164–xprofile=p收集用于分析的数据或使用分析进行优化.
p必须为collect[:profdir]、use[:profdir]或tcov[:profdir].
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01264此选项可在执行期间收集并保存执行频率数据,然后在后续运行中可以使用该数据来改进性能.
对多线程应用程序来讲,分析收集(Profilecollection)是一种安全的方法.
对执行自身多任务处理(-mt)的程序进行分析可产生准确的结果.
只有指定-xO2或更高的优化级别时,此选项才有效.
如果分别执行编译和链接,则链接步骤和编译步骤中必须都出现同一-xprofile选项.
collect[:profdir]在-xprofile=use时优化器收集并保存执行频率,以供将来使用.
编译器生成可测量语句执行频率的代码.
-xMerge,-ztext,和-xprofile=collect不应同时使用.
-xMerge会强制将静态初始化的数据存储到只读存储器中,-ztext禁止在只读存储器中进行依赖于位置的符号重定位,而-xprofile=collect会在可写存储器中生成静态初始化的、依赖于位置的符号重定位.
分析目录名profdir(如果指定)是包含已分析的目标代码的程序或共享库在执行时用来存储分析数据的目录路径名.
如果profdir路径名不是绝对路径,在使用选项-xprofile=use:profdir编译程序时将相对于当前工作目录来解释该路径.
如果未使用—xprofile=collect:prof_dir或—xprofile=tcov:prof_dir指定分析目录名,分析数据将在运行时存储在名为program.
profile的目录中,其中program是已分析的进程主程序的基本名称.
在这种情况下,可以使用环境变量SUN_PROFDATA和SUN_PROFDATA_DIR控制在运行时存储分析数据的位置.
如果已设置,分析数据将写入$SUN_PROFDATA_DIR/$SUN_PROFDATA指定的目录.
如果在编译时指定了分析目录名,则SUN_PROFDATA_DIR和SUN_PROFDATA在运行时将无效.
这些环境变量同样控制由tcov写入的分析数据文件的路径和名称,如tcov(1)手册页中所述.
如果未设置这些环境变量,分析数据将写入当前目录中的目录profdir.
profile,其中profdir是可执行文件的名称或在-xprofile=collect:profdir标志中指定的名称.
如果profdir已在.
profile中结束,-xprofile不会将.
profile附加到profdir中.
如果多次运行程序,那么执行频率数据会累积在profdir.
profile目录中;也就是说,以前执行的输出不会丢失.
如果在不同的步骤中进行编译和链接,应确保使用-xprofile=collect编译的任何目标文件也使用-xprofile=collect进行链接.
以下示例在生成程序所在目录的myprof.
profile目录中收集分析数据,然后使用这些分析数据:demo:CC-xprofile=collect:myprof.
profile-xO5prog.
cc-oprogdemo:.
/progdemo:CC-xprofile=use:myprof.
profile-xO5prog.
cc-oprogA.
2选项参考附录AC++编译器选项265以下示例在目录/bench/myprof.
profile中收集分析数据,然后在优化级别为-xO5的反馈编译中使用收集的分析数据:demo:CC-xprofile=collect:/bench/myprof.
profile\-xO5prog.
cc-oprog.
.
.
runprogfrommultiplelocations.
.
demo:CC-xprofile=use:/bench/myprof.
profile\-xO5prog.
cc-oproguse[:profdir]通过从使用—xprofile=collect[:profdir]或—xprofile=tcov[:profdir]编译的代码中收集的执行频率数据,优化在执行已分析的代码时执行的工作.
profdir是一个目录的路径名,该目录包含运行用—xprofile=collect[:profdir]或—xprofile=tcov[:profdir]编译的程序所收集的分析数据.
要生成可供tcov和—xprofile=use[:profdir]使用的数据,必须在编译时通过选项—xprofile=tcov[:profdir]指定分析目录.
必须在—xprofile=tcov:profdir和—xprofile=use:profdir中指定同一分析目录.
为最大限度地减少混淆情况,请将profdir指定为绝对路径名.
profdir路径名是可选的.
如果未指定profdir,将使用可执行二进制文件的名称.
如果未指定-o,将使用a.
out.
如果未指定profdir,编译器将查找profdir.
profile/feedback或a.
out.
profile/feedback.
例如:demo:CC-xprofile=collect-omyexeprog.
ccdemo:CC-xprofile=use:myexe-xO5-omyexeprog.
cc程序是使用以前生成并保存在feedback文件中的执行频率数据优化的,此数据是先前执行用-xprofile=collect编译的程序时写入的.
除了-xprofile选项之外,源文件和其他编译器选项必须与用于编译(该编译过程创建了生成feedback文件的编译程序)的相应选项完全相同.
编译器的相同版本必须同时用于collect生成和use生成.
如果用-xprofile=collect:profdir编译,则必须将相同的分析目录名profdir用在优化编译中:-xprofile=use:profdir.
另请参见-xprofile_ircache,以了解有关加速collect阶段和use阶段之间的编译的说明.
tcov[:profdir]使用tcov(1)检测目标文件以进行基本块覆盖分析.
如果指定可选的profdir参数,编译器将在指定位置创建分析目录.
该分析目录中存储的数据可通过tcov(1)或由编译器通过-xprofile=use:profdir来使用.
如果省略可选的profdir路径A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01266名,执行已进行分析的程序时将创建分析目录.
只能通过tcov(1)使用该分析目录中存储的数据.
使用环境变量SUN_PROFDATA和SUN_PROFDATA_DIR可以控制分析目录的位置.
如果profdir指定的位置不是绝对路径名,则在编译时将相对于编译时的当前工作目录来解释该位置.
如果为任何目标文件指定了profdir,则必须为同一程序中的所有目标文件指定同一位置.
由profdir指定位置的目录必须在要执行已进行分析的程序的所有计算机中都可以访问.
除非不再需要分析目录中的内容,否则不应删除该目录,因为除非重新编译,否则编译器存储在其中的数据将无法恢复.
如果用-xprofile=tcov:/test/profdata编译一个或多个程序的目标文件,编译器会创建一个名为/test/profdata.
profile的目录并将其用来存储描述已进行分析的目标文件的数据.
该同一目录还可在执行时用来存储与已进行分析的目标文件关联的执行数据.
如果名为myprog的程序使用-xprofile=tcov进行编译并在目录/home/joe中执行,将在运行时创建目录/home/joe/myprog.
profile并将其用来存储运行时分析数据.
A.
2.
165-xprofile_ircache[=path](仅限SPARC)可以将-xprofile_ircache[=path]与-xprofile=collect|use一起使用,并重新使用collect阶段保存的编译数据,以改善use阶段的编译时间.
在编译大程序时,由于中间数据的保存,使得use阶段的编译时间大大减少.
注意,所保存的数据会占用相当大的磁盘空间.

在使用-xprofile_ircache[=path]时,path会覆盖保存缓存文件的位置.
缺省情况下,这些文件会作为目标文件保存在同一目录下.
collect和use阶段出现在两个不同目录中时,指定路径很有用.
以下示例显示了典型的命令序列:example%CC-xO5-xprofile=collect-xprofile_ircachet1.
cct2.
ccexample%a.
out//runcollectsfeedbackdataexample%CC-xO5-xprofile=use-xprofile_ircachet1.
cct2.
ccA.
2.
166-xprofile_pathmap(仅限SPARC)使用-xprofile_pathmap=collect-prefix:use-prefix选项(同时还指定-xprofile=use命令).
以下两个条件都成立且编译器无法找到使用-xprofile=use编译的目标文件的分析数据时,使用-xprofile_pathmap.
A.
2选项参考附录AC++编译器选项267使用-xprofile=use编译目标文件所在的目录与先前使用-xprofile=collect编译目标文件所在的目录不同.
目标文件在分析中共享公共基名,但可以根据它们在不同目录中的位置互相区分.

collect-prefix是某个目录树的UNIX路径名的前缀,该目录树中的目标文件是使用-xprofile=collect编译的.
use-prefix是目录树的UNIX路径名的前缀,该目录树中的目标文件是使用-xprofile=use编译的.
如果指定了-xprofile_pathmap的多个实例,编译器将按照这些实例的出现顺序对其进行处理.
将-xprofile_pathmap实例指定的每个use-prefix与目标文件路径名进行比较,直至找到匹配的use-prefix或发现最后一个指定的use-prefix与目标文件路径名也不匹配.
A.
2.
167-xreduction对自动并行化中的约简进行循环分析.
只有在同时指定了-xautopar时,此选项才有效.
否则,编译器会发出警告.
当启用了约简识别时,编译器会并行化约简,例如点积、最大与最小查找.
这些约简产生的舍入与通过非并行化代码获得的舍入不同.
A.
2.
168–xregs=r[,r.
.
.
]为生成的代码指定寄存器的用法.
r是一个逗号分隔列表,它包含下面的一个或多个子选项:appl、float、frameptr.

用no%作为子选项的前缀会禁用该子选项.
例如:-xregs=appl,no%float请注意,-xregs子选项仅限于特定的硬件平台.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01268表A–43-xregs子选项值含义appl(SPARC)允许编译器将应用程序寄存器用作临时寄存器来生成代码.
应用程序寄存器是:g2、g3或g4(在32位平台上)g2或g3(在64位平台上)应使用-xregs=no%appl编译所有系统软件和库.
系统软件(包括共享库)必须为应用程序保留这些寄存器值.
这些值的使用将由编译系统控制,而且在整个应用程序中必须保持一致.
在SPARCABI中,这些寄存器表示为应用程序寄存器.
由于需要更少的装入和存储指令,因此使用这些寄存器可提高性能.
但是,这样使用可能与某些用汇编代码编写的旧库程序冲突.
float(SPARC)允许编译器通过将浮点寄存器用作整数值的临时寄存器来生成代码.
使用浮点值可能会用到与该选项无关的这些寄存器.
如果希望您的代码没有任何对浮点寄存器的引用,请使用-xregs=no%float并确保您的代码没有以任何方式使用浮点类型.
frameptr(仅限x86)允许编译器将帧指针寄存器(在IA32上为%ebp,在AMD64上为%rbp)用作通用寄存器.
缺省值为-xregs=no%frameptr除非也用-features=no%except禁用了异常,否则C++编译器将忽略-xregs=frameptr.
请注意,-xregs=frameptr是-fast的一部分,但除非同时指定-features=no%except,否则C++编译器将忽略此设置.
通过-xregs=framptr,编译器可以自由使用帧指针寄存器来改进程序性能.
但是,这可能会限制调试器和性能测量工具的某些功能.
堆栈跟踪、调试器和性能分析器不能对通过-xregs=frameptr编译的函数生成报告.
而且,对Posixpthread_cancel()的C++调用将找不到清理处理程序.
如果直接调用或从C或Fortran函数间接调用的C++函数会引发异常,不应该用-xregs=frameptr编译C、Fortran和C++混合代码.
如果使用-fast编译此类混合源代码,请在命令行中的-fast选项后添加-xregs=no%frameptr.
由于64位平台上的可用寄存器更多,因此与64位代码相比,使用—xregs=frameptr编译更容易改进32位代码的性能.
如果同时指定了-xpg,编译器会忽略-xregs=frameptr并发出警告.
此外,-xkeepframe将覆盖-xregs=frameptr.
SPARC缺省值为-xregs=appl,float.
x86缺省值为-xregs=no%frameptr.
在x86系统中,-xpg与-xregs=frameptr不兼容,这两个选项不应一起使用.
还请注意,-fast中包括-xregs=frameptr.
A.
2选项参考附录AC++编译器选项269对于打算供将链接到应用程序的共享库使用的代码,应当使用-xregs=no%appl,float进行编译.
至少共享库应该显式说明它如何使用应用程序寄存器,以便与这些库链接的应用程序知道这些寄存器分配.
例如,在某种全局意义上使用寄存器(例如,使用寄存器指向一些关键数据结构)的应用程序,需要确切地知道其代码未使用-xregs=no%appl编译的某个库如何使用应用程序寄存器,以便安全地与该库链接.
A.
2.
169-xrestrict[=f]将赋值为指针的函数参数视为受限指针.
f必须是下表中列出的值之一:表A–44-xrestrict值值含义%all整个文件中的所有指针参数均被视为限定的.
%none文件中没有指针参数被视为限定的.
%source只有在主源文件中定义的函数是限定的.
在包含文件中定义的函数不是限定的.
fn[,fn.
.
.
]用逗号隔开的一个或多个函数名称的列表.
如果指定一个函数列表,编译器会将指定函数中的指针参数视为限定指针;有关更多信息,请参阅下一节第271页中的"A.
2.
169.
1受限指针".
此命令行选项可以单独使用,但最好将其用于优化.
例如,以下命令将文件prog.
c中的所有指针参数都视为受限指针.
%CC-xO3-xrestrict=%allprog.
cc以下命令将文件prog.
c中的函数agc中的所有指针参数都视为受限指针:%CC-xO3-xrestrict=agcprog.
cc注意,虽然C编程语言的C99标准引入了restrict关键字,但此关键字并不属于当前C++标准.
某些编译器具有针对C99restrict关键字的C++语言扩展,有时拼写为__restrict或__restrict__.
但OracleSolarisStudioC++编译器当前没有该扩展.
-xrestrict选项是源代码中restrict关键字的部分替代.
(使用该关键字后,并非函数的所有指针参数都需要声明为restrict.
)关键字主要影响优化机会,还会限制可以传递给函数的参数.
从源代码中删除restict或__restrict的所有实例不会影响程序的可观测行为.
缺省值为%none;指定-xrestrict与指定-xrestrict=%source等效.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01270A.
2.
169.
1受限指针为使编译器高效并行执行循环,需要确定某些左值是否指定不同的存储区域.
别名是其存储区域相同的左值.
由于需要分析整个程序,因此确定对象的两个指针是否为别名是一个困难而费时的过程.
请考虑以下示例中的函数vsq():extern"C"voidvsq(intn,double*a,double*b){inti;for(i=0;iintmain(){(void)printf(inastringappearsas()\n");return0;}以下示例显示了使用-xtrigraphs=yes编译此代码时的输出.
example%CC-xtrigraphs=yestrigraphs_demo.
ccexample%a.
out()inastringappearsas(]以下示例显示了使用-xtrigraphs=no编译此代码时的输出.
example%CC-xtrigraphs=notrigraphs_demo.
ccexample%a.
out()inastringappearsas()A.
2.
176.
4另请参见有关三字母的信息,请参见《C用户指南》中关于转换到ANSI/ISOC的章节.
A.
2选项参考附录AC++编译器选项277A.
2.
177–xunroll=n此选项指示编译器通过解开循环(如有可能)来优化这些循环.
A.
2.
177.
1值n为1时,建议编译器不要解开循环.
n为大于1的整数(-unroll=n)时,编译器会将循环解开n次.
A.
2.
178-xustr={ascii_utf16_ushort|no}如果代码中包含要编译器转换成目标文件中UTF-16字符串的字符串或字符文字,可以使用该选项.
如果不指定该选项,编译器既不生成、也不识别16位的字符串文字.
使用该选项时,U"ASCII-string"字符串文字会识别为无符号短整型数组.
因为这样的字符串还不属于任何标准,所以该选项的作用是使非标准C++得以识别.
不是所有文件都必须使用该选项编译.
A.
2.
178.
1值如果需要支持使用ISO10646UTF-16文本字符串的国际化应用程序,可指定-xustr=ascii_utf16_ushort.
可以通过指定-xustr=no来禁用编译器对U"ASCII_string"字符串或字符文字的识别.
该选项在命令行上最右侧的实例覆盖了先前的所有实例.

可以指定-xustr=ascii_ustf16_ushort,而无需同时指定U"ASCII-string"字符串文字.
这样执行时不会出现错误.
A.
2.
178.
2缺省值缺省值为-xustr=no.
如果指定了没有参数的-xustr,编译器将不接受该选项,而是发出一个警告.
如果C或C++标准定义了语法的含义,那么缺省设置是可以更改的.
A.
2.
178.
3示例以下示例显示了前置有U的带引号文本字符串.
它还显示指定-xustr的命令行.
example%catfile.
ccconstunsignedshort*foo=U"foo";constunsignedshortbar[]=U"bar";constunsignedshort*fun(){returnfoo;}example%CC-xustr=ascii_utf16_ushortfile.
cc-c8位字符文字可以带有U前缀,以形成一个unsignedshort类型的16位UTF-16字符.
例如:constunsignedshortx=U'x';constunsignedshorty=U'\x79';A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01278A.
2.
179-xvector[=a]启用向量库函数调用自动生成,或在支持SIMD(SingleInstructionMultipleData,单指令多数据)的x86处理器上启用SIMD指令生成.
使用此选项时,必须通过指定-fround=nearest来使用缺省的舍入模式.
-xvector选项需要-xO3或更高的优化级别.
如果优化级别未指定或低于-xO3,编译将不会继续,同时会发出消息.
下表列出了a的可能值.
no%前缀可禁用关联的子选项.
表A–50-xvector子选项值含义[no%]lib(仅限Solaris)允许编译器将循环内的数学库调用转换为对等效向量数学例程的单个调用(如果能够进行此类转换).
此类转换可提高那些循环计数较大的循环的性能.
使用no%lib可以禁用此选项.
[no%]simd(仅限x86)指示编译器使用本机x86SSESIMD指令来提高某些循环的性能.
在x86中,缺省情况下以可产生有利结果的优化级别3和更高级别使用流扩展.
可以使用no%simd禁用此选项.
仅当目标体系结构中存在流扩展(即目标ISA至少为SSE2)时,编译器才会使用SIMD.
例如,可在现代平台中指定-xtarget=woodcrest、-xarch=generic64、-xarch=sse2、-xarch=sse3或-fast来使用它.
如果目标ISA没有流扩展,子选项将无效.
%none完全禁用此选项.
yes此选项已过时;请改为指定-xvector=lib.
no此选项已过时;请改为指定-xvector=%none.
A.
2.
179.
1缺省值在x86平台上的缺省值为-xvector=simd,在SPARC平台上的缺省值为-xvector=%none.
如果指定不带子选项的-xvector,在x86Solaris、SPARCSolaris和Linux平台上,编译器将分别采用-xvector=simd,lib、-xvector=lib和-xvector=simd.
A.
2.
179.
2交互在装入步骤中,编译器包含libmvec库.
如果使用单独的命令进行编译和链接,应确保也在链接CC命令中使用-xvector.
A.
2选项参考附录AC++编译器选项279A.
2.
180-xvis[={yes|no}](仅限SPARC)在使用VIS软件开发者工具包(VISSoftwareDevelopersKit,VSDK)中定义的汇编语言模板时,或使用采用了VIS指令和vis.
h头文件的汇编程序内联代码时,请使用-xvis=[yes|no]命令.
VIS指令集是SPARCv9指令集的扩展.
尽管UltraSPARC是64位处理器,但在很多情况下数据都限制在8位或16位范围内,特别是多媒体应用程序中.
VIS指令可以用一条指令处理四个16位数据,这个特性使得处理诸如图像、线性代数、信号处理、音频、视频以及网络等新媒体的应用程序的性能大大提高.

A.
2.
180.
1缺省值缺省值为-xvis=no.
指定-xvis与指定-xvis=yes等效.
A.
2.
181-xvpara发出关于并行编程相关的潜在问题的警告,在使用OpenMPI时这些问题可能会导致不正确的结果.
与-xopenmp和OpenMPAPI指令一起使用.
编译器在检测到下列情形时会发出警告.
循环是使用MP指令并行化的,而这些指令中的不同循环迭代之间存在数据依赖性OpenMP数据共享属性子句存在问题.
例如,声明在OpenMP并行区域中的访问可能导致数据争用的变量"shared",或者声明其在并行区域中的值在并行区域之后使用的变量"private".
如果所有并行化指令在处理期间均未出现问题,则不显示警告.
注–SolarisStudio编译器支持OpenMPAPI并行化.
因此,已废弃MPpragma指令,不再支持此类指令.
有关迁移到OpenMPAPI的信息,请参见《OpenMPAPI用户指南》.
A.
2.
182–xwe通过返回非零的退出状态,将所有警告转换成错误.
A.
2.
182.
1另请参见第164页中的"A.
2.
15-errwarn[=t]"A.
2.
183-Yc,path指定组件c的位置的新路径.
A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01280如果已指定组件的位置,则组件的新路径名称为path/component-name.
该选项传递给ld.
A.
2.
183.
1值下表列出了c的可能值.
表A–51-Y标志值含义P更改cpp的缺省目录.
0更改ccfe的缺省目录.
a更改fbe的缺省目录.
2更改iropt的缺省目录.
c(SPARC)更改cg的缺省目录.
O更改ipo的缺省目录.
k更改CClink的缺省目录.
l更改ld的缺省目录.
f更改c++filt的缺省目录.
m更改mcs的缺省目录.
u(x86)更改ube的缺省目录.
h(x86)更改ir2hf的缺省目录.
A指定目录以搜索所有编译器组件.
如果在path中找不到组件,搜索将转至编译器的安装目录.
P将路径添加到缺省库搜索路径.
将在缺省库搜索路径之前搜索此路径.
S更改启动目标文件的缺省目录A.
2.
183.
2交互可以在命令行上指定多个-Y选项.
如果对任何一个组件应用了多个-Y选项,则保留最后一个选项.
A.
2.
183.
3另请参见Solaris《链接程序和库指南》A.
2选项参考附录AC++编译器选项281A.
2.
184-z[]arg链接编辑器选项.
有关更多信息,请参见ld(1)手册页和OracleSolaris《链接程序和库指南》.
另请参见第208页中的"A.
2.
98-Xlinkerarg"A.
2选项参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01282Pragma本附录介绍了C++编译器pragma.
pragma是一个编译器指令,程序员可以通过它向编译器提供额外的信息.
该信息可以更改您所控制的编译详细信息.
例如,packpragma会影响结构内的数据布局.
编译器pragma也称为指令.
预处理程序关键字pragma是C++标准的一部分,但每个编译器中,pragma的形式、内容和含义都是不相同.
C++标准不定义任何pragma.
注–依赖于pragma的代码是不可移植的.
B.
1Pragma形式C++编译器pragma的各种形式如下所示:#pragmakeyword#pragmakeyword(a[,akeyword(a[,a#pragmasunkeyword变量keyword指特定指令;a表示参数.
B.
1.
1将函数作为pragma参数进行重载本附录中列出了几个将函数名称作为参数的pragma.
如果重载该函数,则pragma使用其前面的函数声明作为其参数.
请看以下示例:intbar(int);intfoo(int);intfoo(double);#pragmadoes_not_read_global_data(foo,bar)在此示例中,foo指foo(double),即pragma紧前面的foo声明;而bar指bar(int),即唯一声明的bar.
现在,请看以下示例,在此示例中再次重载了foo:B附录B283intfoo(int);intfoo(double);intbar(int);#pragmadoes_not_read_global_data(foo,bar)在此示例中,bar指bar(int),即唯一声明的bar.
但pragma并不知道要使用哪个版本的foo.
要更正此问题,必须将pragma放在希望pragma使用的foo定义的紧后面.
以下pragma使用本节中介绍的选择方法:does_not_read_global_datadoes_not_returndoes_not_write_global_datano_side_effectoptrarely_calledreturns_new_memoryB.
2Pragma参考本节介绍了C++编译器可识别的pragma关键字.
B.
2.
1#pragmaalign#pragmaaligninteger(variable[,variable.
.
.
])使用align使所列变量与integer字节内存对齐,并覆盖缺省设置.
请遵循以下限制:integer必须是2的幂,介于1和128之间.
有效值为1、2、4、8、16、32、64和128.
variable是一个全局或静态变量.
它不能是局部变量或类成员变量.
如果指定的对齐比缺省值小,就使用缺省值.
Pragma行必须出现在所涉及的变量的声明之前.
否则,它将被忽略.
在pragma行上涉及但不在下面pragma行的代码中声明的任何变量都被忽略.
以下示例中的变量是正确声明的.
#pragmaalign64(aninteger,astring,astruct)intaninteger;staticcharastring[256];structS{inta;char*b;}astruct;#pragmaalign在名称空间内部使用时,必须使用改编名称.
例如,以下代码中的#pragmaalign语句就是无效的.
要更正此问题,应将#pragmaalign语句中的a、b和c替换为其改编名称.
B.
2Pragma参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01284namespacefoo{#pragmaalign8(a,b,c)staticchara;staticcharb;staticcharc;}B.
2.
2#pragmadoes_not_read_global_data#pragmadoes_not_read_global_data(funcname[,funcname])此pragma断言,指定的例程不直接或间接读取全局数据,从而在调用此类例程的周围实现更好的代码优化.
具体来讲,赋值语句或存储可以围绕这样的调用移动.

指定函数的原型被声明后,该pragma才可用.
如果全局访问的断言不为真,那么程序的行为就是未定义的.
有关pragma如何将重载的函数名视为参数的更加详细的说明,请参见第283页中的"B.
1.
1将函数作为pragma参数进行重载".
B.
2.
3#pragmadoes_not_return#pragmadoes_not_return(funcname[,funcname])此pragma向编译器断言,将不会返回对指定例程的调用,从而使编译器可执行与该假定一致的优化.
例如,寄存器生命周期在调用点终止,这样可以进行进一步的优化.

如果指定的函数不返回,程序的行为就是未定义的.
指定函数的原型被声明后,该pragma才是可用的,如以下示例所示:externvoidexit(int);#pragmadoes_not_return(exit)externvoid__assert(int);#pragmadoes_not_return(__assert)有关pragma如何将重载的函数名视为参数的更加详细的说明,请参见第283页中的"B.
1.
1将函数作为pragma参数进行重载".
B.
2.
4#pragmadoes_not_write_global_data#pragmadoes_not_write_global_data(funcname[,funcname])此pragma断言,指定的例程列表不直接或间接写入全局数据,从而在调用此类例程的周围实现更好的代码优化.
具体来讲,赋值语句或存储可以围绕这样的调用移动.

指定函数的原型被声明后,该pragma才可用.
如果全局访问的断言不为真,那么程序的行为就是未定义的.
B.
2Pragma参考附录BPragma285有关pragma如何将重载的函数名视为参数的更加详细的说明,请参见第283页中的"B.
1.
1将函数作为pragma参数进行重载".
B.
2.
5#pragmadumpmacros#pragmadumpmacros(value[,value.
.
.
])要查看宏在程序中如何工作时,请使用该pragma.
该pragma提供了诸如宏定义、取消定义和用法实例的信息,并按宏的处理顺序将输出输出到标准错误(stderr).
dumpmacrospragma达到文件结尾或遇到#pragmaend_dumpmacro之前一直有效.
请参见第287页中的"B.
2.
6#pragmaend_dumpmacros".
下表列出了value的可能值:值含义defs打印所有宏定义undefs打印所有取消定义的宏use打印关于使用的宏的信息loc另外打印defs、undefs和use的位置(路径名和行号)conds打印在条件指令中使用的宏的信息sys打印系统头文件中所有宏的定义、取消定义和使用的信息注–子选项loc、conds和sys是defs、undefs和use选项的限定符.
使用loc、conds和sys本身并不会生成任何结果.
例如,#pragmadumpmacros(loc,conds,sys)不起任何作用.
dumpmacrospragma与命令行选项作用相同,但pragma会覆盖命令行选项.
请参见第225页中的"A.
2.
116-xdumpmacros[=value[,value.
.
.
]]".
dumpmacrospragma并不嵌套,因此以下代码行中,处理#pragmaend_dumpmacros时,将停止打印宏信息:#pragmadumpmacros(defs,undefs)#pragmadumpmacros(defs,undefs).
.
.
#pragmaend_dumpmacrosdumpmacrospragma的作用是累积的.
以下代码行#pragmadumpmacros(defs,undefs)#pragmadumpmacros(loc)具有和以下行相同的效果:B.
2Pragma参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01286#pragmadumpmacros(defs,undefs,loc)如果使用选项#pragmadumpmacros(use,no%loc),则使用的每个宏的名称仅输出一次.
如果使用选项#pragmadumpmacros(use,loc),则每次使用宏时都输出位置和宏名称.
B.
2.
6#pragmaend_dumpmacros#pragmaend_dumpmacros此pragma标记dumpmacrospragma的结尾,并停止输出有关宏的信息.
如果没有在dumpmacrospragma后面使用end_dumpmacrospragma,dumpmacrospragma会在文件结尾一直生成输出.
B.
2.
7#pragmaerror_messages#pragmaerror_messages(on|off|default,tag…tag)错误消息pragma提供源程序内部对编译器发出的消息的控制.
Pragma只对警告消息有效.
-w命令行选项可通过抑制所有警告消息来覆盖此pragma.
#pragmaerror_messages(on,tag…tag)on选项结束前面的任何#pragmaerror_messages选项(如off选项)的作用域,并覆盖-erroff选项的效果.
#pragmaerror_messages(off,tag…tag)off选项阻止编译器程序发出以pragma中指定的标记开头的指定消息.
pragma对任何指定的错误消息的作用域仍然有效,直到被另一个#pragmaerror_messages覆盖或编译结束.
#pragmaerror_messages(default,tag…tag)default选项结束前面的任何#pragmaerror_messages指令对指定标记的作用域.
B.
2.
8#pragmafini#pragmafini(identifier[,identifier.
.
.
])可使用fini将identifier标记为完成函数.
此类函数应为void类型,不接受任何参数,当程序在程序控制下终止或从内存删除包含的共享对象时调用它们.
与初始化函数一样,完成函数按链接编辑器处理的顺序执行.
在源文件中,#pragmafini中指定的函数在该文件中的静态析构函数后面执行.
在pragma中使用标识符之前,请先声明这些标识符.
此类函数每出现在#pragmafini指令中一次,就会被调用一次.
B.
2Pragma参考附录BPragma287B.
2.
9#pragmahdrstop可将hdrstoppragma嵌入源文件的头文件中以标识源文件活前缀的结尾.
例如,考虑以下文件:example%cata.
cc#include"a.
h"#include"b.
h"#include"c.
h"#include#include"d.
h".
.
.
example%catb.
cc#include"a.
h"#include"b.
h"#include"c.
h"源文件活前缀以c.
h结束,因此可在每个文件中的c.
h后面插入#pragmahdrstop.
#pragmahdrstop只能位于用CC命令指定的源文件活前缀的结尾处.
不要在任何include文件中指定#pragmahdrstop.
请参见第255页中的"A.
2.
156-xpch=v"和第257页中的"A.
2.
157-xpchstop=file".
B.
2.
10#pragmaident#pragmaidentstring可使用ident将string放在可执行文件的.
comment部分中.
B.
2.
11#pragmainit#pragmainit(identifier[,identifier.
.
.
])可使用init将identifier标记为初始化函数.
此类函数应为void类型,不接受任何参数,在开始执行时构造程序的内存映像的情况下调用.
执行将共享对象送入内存的操作时(程序启动时,或执行某些动态装入操作时,例如dlopen()),执行共享对象中的初始化函数.
调用到初始化函数的唯一顺序就是链接编辑器静态和动态处理该函数的顺序.
在源文件中,#pragmainit中指定的函数在该文件中的静态析构函数后面执行.
在pragma中使用标识符之前,请先声明这些标识符.
此类函数每出现在#pragmainit指令中一次,就会被调用一次.
B.
2Pragma参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01288B.
2.
12#pragmaivdepivdeppragma指示编译器忽略在循环中找到的部分或全部对数组引用的循环附带依赖性,以进行优化.
这将使编译器能够执行各种循环优化(例如微向量化、分发、软件流水线等),而以其他方式可能无法执行这些优化.
当用户知道这些依赖性无关紧要或者实际上永远不会发生时,可以使用该指令.
#pragmaivdep指令的解释依赖于—xivdep选项的值.
B.
2.
13#pragmamust_have_frame#pragmamust_have_frame(funcname[,funcname])该pragma要求总是编译指定的一组函数来获得完整的堆栈帧(如SystemVABI中所定义).
必须在使用该pragma列出函数之前,声明该函数的原型.
externvoidfoo(int);externvoidbar(int);#pragmamust_have_frame(foo,bar)只有在声明了指定函数的原型后,才允许使用该pragma.
该pragma必须位于函数结尾之前.
voidfoo(int){.
#pragmamust_have_frame(foo).
return;}请参见第283页中的"B.
1.
1将函数作为pragma参数进行重载".
B.
2.
14#pragmano_side_effect#pragmano_side_effect(name[,name.
.
.
])可使用no_side_effect指示函数不更改任何持久状态.
Pragma声明了命名的函数不具有任何副作用.
也就是说,函数将返回仅依赖于传递参数的结果.
此外,函数及其调用的子孙函数行为如下所示:不读取或写入调用时调用程序中可视程序状态的任何部分.
不执行I/O.
不更改调用时不可视程序状态的任何部分.
编译器执行优化时可以使用该信息.
如果函数具有副作用,执行调用该函数的程序的结果是未定义的.
B.
2Pragma参考附录BPragma289name参数指定当前转换单元中函数的名称.
Pragma必须与函数在相同的作用域,并且必须在函数声明之后出现.
pragma必须在函数定义之前.
有关pragma如何将重载的函数名视为参数的更加详细的说明,请参见第283页中的"B.
1.
1将函数作为pragma参数进行重载".
B.
2.
15#pragmaopt#pragmaoptlevel(funcname[,funcname])funcname指定当前转换单元中定义的函数的名称.
level值指定用于所指定函数的优化级别.
可以指定优化级别0、1、2、3、4、5.
可以通过将level设置为0来关闭优化.
必须在该pragma之前使用原型或空参数列表声明函数.
pragma则必须对要优化的函数进行定义.
pragma中所列任何函数的优化级别都降为-xmaxopt值.
-xmaxopt=off时,忽略pragma.
有关pragma如何将重载的函数名视为参数的更加详细的说明,请参见第283页中的"B.
1.
1将函数作为pragma参数进行重载".
B.
2.
16#pragmapack(n)#pragmapack([n])可使用pack影响对结构成员的封装.
如果使用了该项,n必须为0或2的幂.
0以外的值指示编译器针对数据类型使用n字节对齐和平台的自然对齐中的较小者.
例如,以下指令使在指令后面(以及后续的pack指令前面)定义的所有结构成员对齐时依据的字节边界不严于2字节边界,即使正常对齐是4或8字节边界时也是如此.
#pragmapack(2)n为0或省略该项时,成员对齐还原为自然对齐值.
如果n值等于或大于平台上最严格的对齐时,则采用自然对齐.
下表显示了每个平台最严格的对齐.
表B–1平台上最严格的对齐平台最严格的对齐x864SPARC通用8B.
2Pragma参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01290表B–1平台上最严格的对齐(续)平台最严格的对齐64位SPARCV9(-m64)16pack指令应用于自身与下一个pack指令之间的所有结构定义.
如果在具有不同包装的不同转换单元中定义了相同的结构,那么程序可能会因某种原因而失败.
具体来说,不应该在包括定义预编译库接口的头文件之前使用pack指令.
建议将pack指令放在要封装的结构紧前面的程序代码中,并将#pragmapack()放在该结构紧后面.
如果在SPARC平台上使用#pragmapack封装效果比类型的缺省对齐紧密,必须为应用程序的编译和链接指定-misalign选项.
下表显示了整型数据类型的存储大小和缺省对齐.
表B–2存储大小和缺省对齐字节数类型32位SPARC大小,对齐64位SPARC大小,对齐x86大小,对齐bool1,11,11,1char1,11,11,1short2,22,22,2wchar_t4,44,44,4int4,44,44,4long4,48,84,4float4,44,44,4double8,88,88,4longdouble16,816,1612,4指向数据的指针4,48,84,4指向函数的指针4,48,84,4指向成员数据的指针4,48,84,4指向成员函数的指针8,416,88,4B.
2.
17#pragmararely_called#pragmsrarely_called(funcname[,funcname])B.
2Pragma参考附录BPragma291此pragma向编译器发出提示以说明很少调用指定的函数,从而使编译器可以对此类例程的调用点执行分析反馈式优化,而不需要分析收集阶段的开销.
因为该pragma只是建议,所以编译器不执行基于该pragma的任何优化.
只有在声明指定函数的原型之后,才能使用#pragmararely_called预处理程序指令.
以下是#pragmararely_called示例:externvoiderror(char*message);#pragmararely_called(error)有关pragma如何将重载的函数名视为参数的更加详细的说明,请参见第283页中的"B.
1.
1将函数作为pragma参数进行重载".
B.
2.
18#pragmareturns_new_memory#pragmareturns_new_memory(name[,name.
.
.
])此pragma断言,每个指定的函数都返回新分配内存的地址,以及指针没有与任何其他指针相关的别名.
使用该信息,优化器可以更好地跟踪指针值,厘清内存分配,从而改善调度和流水作业.
如果该断言为假,那么执行调用该函数的程序的结果是未定义的.
name参数指定当前转换单元中函数的名称.
Pragma必须与函数在相同的作用域,并且必须在函数声明之后出现.
pragma必须在函数定义之前.
有关pragma如何将重载的函数名视为参数的更加详细的说明,请参见第283页中的"B.
1.
1将函数作为pragma参数进行重载".
B.
2.
19#pragmaunknown_control_flow#pragmaunknown_control_flow(name[,name.
.
.
])可使用unknown_control_flow指定一组违反过程调用的常规控制流属性的例程.
例如,可通过任意的任何其他例程调用来访问setjmp()调用后面的语句.
该语句通过调用longjmp()来访问.
因为这种例程使标准流程图分析无效,调用它们的例程不能安全地优化,所以要禁用优化器来编译这些例程.
如果函数名称被重载,那么会选择最近声明的函数.
B.
2.
20#pragmaweak#pragmaweakname1[=name2]B.
2Pragma参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01292可使用weak定义弱全局符号.
该pragma主要在源文件中用于生成库.
链接程序在不能解决弱符号时不会发出警告.
weakpragma可以按以下两种形式之一来指定符号:字符串形式.
字符串必须是C++变量或函数的改编名称.
无效改编名称引用的行为是不可预测的.
编译器可能不会针对无效的改编名称引用生成错误.
无论是否生成错误,使用了无效改编名称时编译器的行为都是不可预测的.
标识符形式.
标识符必须是之前在编译单元中声明的C++函数的明确标识符.
标识符形式不能用于变量.
前端(ccfe)遇到无效的标识符引用时会生成错误消息.
B.
2.
20.
1#pragmaweakname采用#pragmaweakname形式时,指令使name成为弱符号.
链接程序将不会指示是否未找到name的符号定义.
它也不会在出现符号的多个弱定义时发出警告.
链接程序仅执行第一个遇到的定义.
如果另一个编译单元有函数或变量的强定义,那么name将链接到它.
如果没有name的强定义,那么链接程序符号的值为0.
以下指令将ping定义为弱符号.
链接程序找不到名为ping的符号的定义时,不会生成错误消息.
#pragmaweakping#pragmaweakname1=name2采用#pragmaweakname1=name2形式时,符号name1成为对name2的弱引用.
如果没有在其他地方定义name1,那么name1的值为name2.
如果在其他地方定义了name1,那么链接程序使用该定义并忽略对name2的弱引用.
以下指令指示链接程序解析对bar(如果已在程序中某处定义)的任何引用,以及解析对foo的引用.
#pragmaweakbar=foo采用标识符形式时,必须在当前编译单元中声明和定义name2.
例如:externvoidbar(int){.
.
.
}externvoid_bar(int);#pragmaweak_bar=bar使用字符串形式时,符号不需要预先声明.
如果以下示例中的_bar和bar都是extern"C",则不需要声明函数.
但bar必须在同一对象中定义.
extern"C"voidbar(int){.
.
.
}#pragmaweak"_bar"="bar"B.
2Pragma参考附录BPragma293重载函数使用标识符形式时,在pragma位置的作用域中必须只有一个具有指定名称的函数.
尝试将标识符形式#pragmaweak用于重载函数会出现错误.
例如:intbar(int);floatbar(float);#pragmaweakbar//error,ambiguousfunctionname要避免错误,请使用字符串形式,如以下示例所示.
intbar(int);floatbar(float);#pragmaweak"__1cDbar6Fi_i_"//makefloatbar(int)weak有关更多信息,请参见OracleSolaris《链接程序和库指南》.
B.
2Pragma参考OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01294词汇表ABI请参见ApplicationBinaryInterface(应用程序二进制接口).
abstractclass(抽象类)包含一个或多个抽象方法并因此不能被实例化的类.
定义抽象类的目的是为了通过实现抽象方法,使其他类可以扩展抽象类并使其固定.
abstractmethod(抽象方法)不包含实现的方法.
ANSIC美国国家标准学会定义的C编程语言.
ANSIC与ISO定义相同.
请参见ISO.
ANSI/ISOC++美国国家标准学会和ISOC++编程语言标准.
请参见ISO.
applicationbinaryinterface(应用程序二进制接口)编译的应用程序和运行应用程序的操作系统之间的二进制系统接口.
array(数组)内存中连续存储一组单一数据类型值的数据结构.
每个值可以按在数组中的位置访问.

binarycompatibility(二进制兼容性)链接目标文件的能力,目标文件由某一个发行版本编译,而使用另一个不同发行版本的编译器.
binding(绑定)将函数调用与特定函数定义关联.
更一般的说来,将名称与特定的实体关联.

cfrontC++到C的编译器程序,可以将C++转换为C源代码,然后用标准C编译器编译.
classtemplate(类模板)描述一组类或相关数据类型的模板.
classvariable(类变量)作为一个整体与特定类关联但与类的特定实例不关联的数据项.
类变量在类定义中定义.
类变量也称为静态字段.
另请参见instancevariable(实例变量).
class(类)由命名的数据元素(可以是不同类型的数据元素)和可以和数据一起执行的一组操作组成的用户定义数据类型.
compileroption(编译器选项)更改编译器行为的指令.
例如,-g选项表示通知编译器为调试器生成数据.
同义字:标志、开关.
constructor(构造函数)每当创建类对象时编译器都会自动调用的特殊类成员函数,用于确保初始化相应对象的实例变量.
构造函数必须始终具有与该函数所属的类相同的名称.
请参见destructor(析构函数).
295datamember(数据成员)是数据而不是函数或类型定义的类元素.
datatype(数据类型)用来表示字符、整数或浮点数等的机制.
类型决定了分配到变量的存储以及能在变量上执行的操作.
destructor(析构函数)每当销毁类对象或对类指针应用运算符delete时编译器都会自动调用的特殊类成员函数.
析构函数必须始终具有与该函数所属的类相同的名称,该类前有一个(~).
请参见constructor(构造函数).
dynamicbinding(动态绑定)在运行时函数调用到函数体的连接.
有虚函数时才需动态绑定.
也称为迟绑定、运行时绑定.
dynamiccast(动态强制类型转换)将指针或引用从声明的类型转换到与引用到的动态类型一致的任何类型的安全方法.

dynamictype(动态类型)由具有不同声明类型的指针或引用访问的对象的实际类型.
earlybinding(早绑定)请参见staticbinding(静态绑定).
ELFfile(ELF文件)编译器生成的可执行和链接格式文件.
exceptionhandler(异常处理程序)为处理错误而专门编写的代码,当发生了已为其注册了处理程序的异常时,会自动调用该代码.
exceptionhandling(异常处理)设计用于拦截并防止错误的错误恢复过程.
在程序执行期间,如果检测到同步错误,那么程序的控制返回到在执行初期注册的异常处理程序,并且忽略包含错误的代码.

exception(异常)在正常的程序流中出现的错误,阻止程序继续运行.
某些错误的原因包括了内存枯竭或被零除.
flag(标志)请参见compileroption(编译器选项).
functionoverloading(函数重载)将相同的名称但不同的参数类型和数字赋予不同的函数.
也称为函数多态.

functionprototype(函数原型)描述函数与程序其他部分之间的接口的声明.
functiontemplate(函数模板)一种机制,允许您编写单一函数,之后在编写相关函数时可以将该函数用作模型或模式.

functionalpolymorphism(函数多态)请参见functionoverloading(函数重载).
idempotent(幂等)头文件属性,在一个转换单元中包括多次与包括一次具有相同效果.
incrementallinker(增量链接程序)通过仅将更改后的.
o文件链接到前一个可执行文件来创建新的可执行文件的链接程序.
datamember(数据成员)OracleSolarisStudio12.
3:C++用户指南2011年12月,E26439-01296baseclass(基类)请参见inheritance(继承).
derivedclass(派生类)请参见inheritance(继承).
inheritance(继承)面向对象编程的一个功能,使得程序员可以从现有类(基类)派生新的类(派生类).
有以下三种继承:公共的、受保护的和专用的.
inlinefunction(内联函数)用实际函数代码替换函数调用的函数.
instancevariable(实例变量)与特定对象关联的任何数据项.
类的每个实例具有在类中定义的实例变量的自身副本.
实例变量也称为字段.
另请参见classvariable(类变量).
instantiation(实例化)C++编译器从模板创建可用的函数或对象的过程.
ISO国际标准化组织.
K&RCBrianKernighan和DennisRitchie在ANSIC之前开发的实际上的C编程语言标准.
keyword(关键字)在编程语言中具有唯一含义,并且仅在该语言的专用上下文中使用的字.

latebinding(迟绑定)请参见dynamicbinding(动态绑定).
linker(链接程序)连接目标代码和库以形成完整的可执行程序的工具.
localvariable(局部变量)在块内已知的数据项,但块外代码不可访问.
例如,在方法内定义的任何变量都是局部变量,在方法外部无法使用.
locale(语言环境)某个地理区域或语言特有的一组约定,例如日期、时间和货币格式.
lvalue(左值)指定变量数据值在内存中的存储位置的表达式.
即显示在赋值运算符左侧的变量实例.

mangle(改编)请参见namemangling(名称改编).
memberfunction(成员函数)身为函数(而非数据定义或类型定义)的类的元素.
method(方法)在某些面向对象的语言中,成员函数的另外一个名称.
multipleinheritance(多继承)直接源于多个基类的派生类的继承.
multithreading(多线程)在单处理器或多处理器系统上开发并行应用程序的软件技术.
namemangling(名称改编)在C++中,大量函数可以共享相同的名称,因此仅用名称并不能很好的区分不同的函数.
编译器通过名称改编解决这个问题:为函数创建由函数名称及其参数的某些组合组成的函数的唯一名称.
该策略启用了类型安全链接.
也称为名称修饰.
namespace(名称空间)控制全局名称的作用域的机制,做法是允许全局空间划分为独立的唯一命名的作用域.

operatoroverloading(运算符重载)使用同一运算符表示法产生不同结果的能力.
函数重载的特殊形式.
operatoroverloading(运算符重载)297optimization(优化)改善编译器生成的目标代码执行效率的过程.
option(选项)请参见compileroption(编译器选项).
overloading(重载)将相同的名称赋予多个函数或运算符.
polymorphism(多态性)引用到对象的指针或引用的动态类型与声明的指针或引用类型不同的能力.

pragma指示编译器执行特定操作的编译器预处理程序指令或特殊的注释.
runtimebinding(运行时绑定)请参见dynamicbinding(动态绑定).
runtimetypeidentification(运行时类型标识)提供标准方法以让程序在运行时决定对象类型的机制.
rvalue(右值)位于赋值运算符右侧的变量.
右值可以读取而不能被更改.
scope(作用域)操作或定义应用的范围.
stab在目标代码中生成的符号表条目.
在a.
out文件和ELF文件中使用相同的格式来包含调试信息.
stack(堆栈)一种数据存储方法,通过该方法,可以将数据添加到堆栈顶部或从堆栈顶部删除数据,采用的是后进先出策略.
staticbinding(静态绑定)在编译期间函数调用到函数体的连接.
也称为earlybinding(早绑定).
subroutine(子例程)函数.
在Fortran中,子例程是不返回值的函数.
switch(开关)请参见compileroption(编译器选项).
symboltable(符号表)程序编译时显示的所有标识符、程序中标识符的位置和属性的列表.
编译器使用该表来解释标识符的使用.
symbol(符号)表示某些程序实体的名称或标签.
templatedatabase(模板数据库)包含需要处理并实例化模板(程序需要)的所有配置文件的目录.
templateoptionsfile(模板选项文件)由用户提供的文件,其中包含模板编译选项、源码位置和其他信息.
模板选项文件现在已过时,不应该使用.
templatespecialization(模板专门化)类模板成员函数的专用实例,用于缺省不能处理给出的足够类型时覆盖缺省实例.

WHloud Date鲸云数据($9.00/月), 韩国,日本,香港

WHloud Date(鲸云数据),原做大数据和软件开发的团队,现在转变成云计算服务,面对海内外用户提供中国大陆,韩国,日本,香港等多个地方节点服务。24*7小时的在线支持,较为全面的虚拟化构架以及全方面的技术支持!官方网站:https://www.whloud.com/WHloud Date 韩国BGP云主机少量补货随时可以开通,随时可以用,两小时内提交退款,可在工作日期间全额原路返回!支持pa...

DiyVM:499元/月香港沙田服务器,L5630*2/16G内存/120G SSD硬盘/5M CN2线路

DiyVM是一家成立于2009年的国人主机商,提供的产品包括VPS主机、独立服务器租用等,产品数据中心包括中国香港、日本大阪和美国洛杉矶等,其中VPS主机基于XEN架构,支持异地备份与自定义镜像,VPS和独立服务器均可提供内网IP功能。商家VPS主机均2GB内存起步,三个地区机房可选,使用优惠码后每月69元起;独立服务器开设在香港沙田电信机房,CN2线路,自动化开通上架,最低499元/月起。下面以...

pacificrack7月美国便宜支持win VPS,$19.99/年,2G内存/1核/50gSSD/1T流量

pacificrack发布了7月最新vps优惠,新款促销便宜vps采用的是魔方管理,也就是PR-M系列。提一下有意思的是这次支持Windows server 2003、2008R2、2012R2、2016、2019、Windows 7、Windows 10,当然啦,常规Linux系统是必不可少的!1Gbps带宽、KVM虚拟、纯SSD raid10、自家QN机房洛杉矶数据中心...支持PayPal、...

怎么设置虚拟内存为你推荐
租用虚拟主机想做网站租用虚拟主机谁能推荐我一下哪家的稳定,价格便宜。免费国内空间谁知道国内哪个免费空间好,要1GB的域名购买为什么要购买域名,域名是干嘛用的?me域名.me域名和com的价值对比,懂的告诉我呀海外域名外贸网站如何选择合适的海外域名?100m网站空间100M的最好的网站空间价格多少?虚拟主机软件常见的虚拟机软件有哪几种?北京虚拟主机北京服务好的虚拟主机代理商介绍几个?美国虚拟主机购买美国虚拟主机在国内那家卖的便宜,稳定,功能全??虚拟主机99idc如何选择虚拟主机的的操作系统以及更换操作系统是注意事项
虚拟主机购买 动态域名 服务器租用托管 汉邦高科域名申请 域名备案中心 域名解析文件 securitycenter raksmart 新世界电讯 韩国网名大全 个人空间申请 美国十次啦服务器 100x100头像 e蜗 工作站服务器 网游服务器 银盘服务是什么 彩虹云 太原联通测速 双线空间 更多