读书人

请问3个C++有关问题

发布时间: 2013-08-10 21:14:06 作者: rapoo

请教3个C++问题
1. g++中的关于速度的优化是哪个,和VC++ 6.0中最快速度优化相比怎么样? 40'
2. windows xp为单个程序分配的最大内存是多少?Linux呢? 20’
3. 错误“系统DLL user32.dll在内村中重定位,应用程序将不能正常运行。由于DLL Dynamically Allocated Memory占用了为windows系统DLL保存的地址空间而产生了错误。应当与DLL的供应商联系以得到新的DLL”的原因是什么?60'
[解决办法]


用法:g++ [选项] 文件...
选项:
-pass-exit-codes 在某一阶段退出时返回最高的错误码
--help 显示此帮助说明
--target-help 显示目标机器特定的命令行选项
--help={target
[解决办法]
optimizers
[解决办法]
warnings
[解决办法]
params
[解决办法]
[^]{joined
[解决办法]
separate
[解决办法]
undocumented}}[,...]
显示特定类型的命令行选项
(使用‘-v --help’显示子进程的命令行参数)
--version 显示编译器版本信息
-dumpspecs 显示所有内建 spec 字符串
-dumpversion 显示编译器的版本号
-dumpmachine 显示编译器的目标处理器
-print-search-dirs 显示编译器的搜索路径
-print-libgcc-file-name 显示编译器伴随库的名称
-print-file-name=<库> 显示 <库> 的完整路径
-print-prog-name=<程序> 显示编译器组件 <程序> 的完整路径


-print-multi-directory 显示不同版本 libgcc 的根目录
-print-multi-lib 显示命令行选项和多个版本库搜索路径间的映射
-print-multi-os-directory 显示操作系统库的相对路径
-print-sysroot 显示目标库目录
-print-sysroot-headers-suffix 显示用于寻找头文件的 sysroot 后缀
-Wa,<选项> 将逗号分隔的 <选项> 传递给汇编器
-Wp,<选项> 将逗号分隔的 <选项> 传递给预处理器
-Wl,<选项> 将逗号分隔的 <选项> 传递给链接器
-Xassembler <参数> 将 <参数> 传递给汇编器
-Xpreprocessor <参数> 将 <参数> 传递给预处理器
-Xlinker <参数> 将 <参数> 传递给链接器
-combine 将多个源文件一次性传递给汇编器
-save-temps 不删除中间文件
-save-temps=<arg> 不删除中间文件
-no-canonical-prefixes 生成其他 gcc 组件的相对路径时不生成规范化的
前缀
-pipe 使用管道代替临时文件
-time 为每个子进程计时
-specs=<文件> 用 <文件> 的内容覆盖内建的 specs 文件
-std=<标准> 指定输入源文件遵循的标准
--sysroot=<目录> 将 <目录> 作为头文件和库文件的根目录
-B <目录> 将 <目录> 添加到编译器的搜索路径中
-b <机器> 为 gcc 指定目标机器(如果有安装)
-V <版本> 运行指定版本的 gcc(如果有安装)


-v 显示编译器调用的程序
-### 与 -v 类似,但选项被引号括住,并且不执行命令
-E 仅作预处理,不进行编译、汇编和链接
-S 编译到汇编语言,不进行汇编和链接
-c 编译、汇编到目标代码,不进行链接
-o <文件> 输出到 <文件>
-x <语言> 指定其后输入文件的语言
允许的语言包括:c c++ assembler none
‘none’意味着恢复默认行为,即根据文件的扩展名猜测
源文件的语言

以 -g、-f、-m、-O、-W 或 --param 开头的选项将由 g++ 自动传递给其调用的
不同子进程。若要向这些进程传递其他选项,必须使用 -W<字母> 选项。

报告程序缺陷的步骤请参见:
<http://gcc.gnu.org/bugs.html>.



C/C++ 编译器选项


-优化-

/O1 最小化空间 /O2 最大化速度
/Ob<n> 内联扩展(默认 n=0) /Od 禁用优化(默认)
/Og 启用全局优化 /Oi[-] 启用内部函数
/Os 优选代码空间 /Ot 优选代码速度


/Ox 最大化优化 /Oy[-] 启用帧指针省略

-代码生成-

/GF 启用只读字符串池 /Gm[-] 启用最小重新生成
/Gy[-] 分隔链接器函数 /GS[-] 启用安全检查
/GR[-] 启用 C++ RTTI /GX[-] 启用 C++ EH (与 /EHsc 相同)
/EHs 启用 C++ EH (没有 SEH 异常) /EHa 启用 C++ EH (w/ SEH 异常)
/EHc 外部“C”默认为 nothrow
/fp:<except[-]
[解决办法]
fast
[解决办法]
precise
[解决办法]
strict> 选择浮点模式:
except[-] - 在生成代码时考虑浮点异常
fast -“fast”浮点模式;结果可预测性比较低
precise -“precise”浮点模式;结果可预测
strict -“strict” 浮点模式(意味着 /fp:except)
即使使用 /fp:except,/Qfast_transcendentals 也生成内联内部 FP
/GL[-] 启用链接时代码生成 /GA 为 Windows 应用程序进行优化
/Ge 对所有函数强制堆栈检查 /Gs[num] 控制堆栈检查调用
/Gh 启用 _penter 函数调用 /GH 启用 _pexit 函数调用
/GT 生成纤程安全 TLS 访问 /RTC1 启用快速检查(/RTCsu)
/RTCc 转换为较小的类型检查 /RTCs 堆栈帧运行时检查
/RTCu 未初始化的局部用法检查
/clr[:option] 为公共语言运行时编译,其中 option 是:
pure - 生成只包含 IL 的输出文件(没有本机可执行代码)
safe - 生成只包含 IL 的可验证输出文件
oldSyntax - 接受 Visual C++ 2002/2003 的托管扩展语法


initialAppDomain - 启用 Visual C++ 2002 的初始 AppDomain 行为
noAssembly - 不产生程序集 /Gd __cdecl 调用约定
/Gr __fastcall 调用约定 /Gz __stdcall 调用约定
/GZ 启用堆栈检查(/RTCs) /QIfist[-] 使用 FIST 而不是 ftol()
/hotpatch 确保可热修补映像的函数填充
/arch:<SSE
[解决办法]
SSE2
[解决办法]
AVX> CPU 架构的最低要求,以下选项之一:
SSE - 启用支持 SSE 的 CPU 可用的指令
SSE2 - 启用支持 SSE2 的 CPU 可用的指令
AVX - 支持使用 Intel(R) 高级矢量扩展指令
/Qimprecise_fwaits 仅在“try”边界而不是“try”内部生成 FWAITs
/Qsafe_fp_loads 生成安全 FP 负载

-输出文件-

/Fa[file] 命名程序集列表文件 /FA[scu] 配置程序集列表
/Fd[file] 命名 .PDB 文件 /Fe<file> 命名可执行文件
/Fm[file] 命名映射文件 /Fo<file> 命名对象文件
/Fp<file> 命名预编译头文件 /Fr[file] 命名源浏览器文件
/FR[file] 命名扩展 .SBR 文件 /Fi[file] 命名预处理的文件
/doc[file] 处理 XML 文档注释,并可选择命名 .xdc 文件

-预处理器-

/AI<dir> 添加到程序集搜索路径 /FU<file> 强制使用程序集/模块
/C 不抽出注释 /D<name>{=
[解决办法]
#}<text> 定义宏
/E 预处理到 stdout /EP 预处理到 stdout,无行号


/P 预处理到文件 /Fx 将插入的代码合并到文件中
/FI<file> 命名强制包含文件 /U<name> 移除预定义的宏
/u 移除所有预定义的宏 /I<dir> 添加到包含搜索路径
/X 忽略“标准位置”

-语言-

/Zi 启用调试信息 /Z7 启用旧式调试信息
/Zp[n] 在 n 字节边界上包装结构 /Za 禁用扩展
/Ze 启用扩展(默认) /Zl 省略 .OBJ 中的默认库名
/Zg 生成函数原型 /Zs 只进行语法检查
/vd{0
[解决办法]
1
[解决办法]
2} 禁用/启用 vtordisp /vm<x> 指向成员的指针类型
/Zc:arg1[,arg2] C++ 语言合规性,这里的参数可以是:
forScope[-] - 对范围规则强制使用标准 C++
wchar_t[-] - wchar_t 是本机类型,不是 typedef
auto[-] - 对 auto 强制使用新的标准 C++ 含义
trigraphs[-] - 启用三元祖(默认为关闭)
/ZI 启用“编辑并继续”调试信息 /openmp 启用 OpenMP 2.0 语言扩展

- 杂项 -

@<file> 选项响应文件 /?, /help 打印此帮助消息
/bigobj 生成扩展的对象格式 /c 只编译,不链接
/errorReport:option 将内部编译器错误报告给 Microsoft
none - 不发送报告 prompt - 提示立即发送报告


queue - 在下一次管理员登录时,提示发送报告(默认)
send - 自动发送报告 /FC 诊断中使用完整路径名
/H<num> 最大外部名称长度 /J 默认 char 类型是 unsigned
/MP[n] 最多使用“n”个进程进行编译 /nologo 取消显示版权信息
/showIncludes 显示包含文件名 /Tc<source file> 将文件编译为 .c
/Tp<source file> 将文件编译为 .cpp /TC 将所有文件编译为 .c
/TP 将所有文件编译为 .cpp /V<string> 设置版本字符串
/w 禁用所有警告 /wd<n> 禁用警告 n
/we<n> 将警告 n 视为错误 /wo<n> 发出一次警告 n
/w<l><n> 为 n 设置警告等级 1-4 /W<n> 设置警告等级(默认 n=1)
/Wall 启用所有警告 /WL 启用单行诊断
/WX 将警告视为错误 /Yc[file] 创建 .PCH 文件
/Yd 将调试信息放在每个 .OBJ 中 /Yl[sym] 为调试库插入 .PCH 引用
/Yu[file] 使用 .PCH 文件 /Y- 禁用所有 PCH 选项
/Zm<n> 最大内存分配(默认为 %) /Wp64 启用 64 位端口定位警告

-链接-

/LD 创建 .DLL /LDd 创建 .DLL 调试库
/LN 创建 .netmodule /F<num> 设置堆栈大小
/link [链接器选项和库] /MD 与 MSVCRT.LIB 链接
/MT 与 LIBCMT.LIB 链接 /MDd 与 MSVCRTD.LIB 调试库链接


/MTd 与 LIBCMTD.LIB 调试库链接



[解决办法]
2.XP虚拟内存是4G,用户代码大概是2-3G
3.http://hi.baidu.com/feiniaoah/blog/item/9cdca852cfdd56080df3e355.html
[解决办法]

g++其他命令
-g 产生调试符号
-H 显示所有链接的头文件
-Wall 显示所有的编译警告
-s 最小化尺寸(调用strip)
-O优化速度(-O -O1 -O2 -O3完全优化)
-Os 优化生成的代码大小

Code::Blocks 里可以预编译文件头
-Winvalid-pch
-include pch.h


[解决办法]
Windows XP 是 NT32系统
32位Windows系统可寻址4GB的地址空间,
在大多数系统上 4G内存分成两半

整个系统共用 2G的系统空间 (0xFFFFFFF - ox80000000)

每个进程私有 2GB的用户空间 (0x7FFFFFF - ox00000000)
[解决办法]
整个系统共用 2G的系统空间 (0xFFFFFFFF - ox80000000) (Windows程序设计 第2版 王艳平) 图表上少了个F
每个进程私有 2GB的用户空间 (0x7FFFFFF - ox00000000)

另一本电子书查到的资料
内核方式分区真的需要上面的一半地址空间吗?实际上回答是肯定的。系统需要这个地址空间,供内核代码、设备驱动程序代码、设备I / O高速缓存、非页面内存池的分配和进程页面表等使用。实际上M i c r o s o f t将内核压缩到这个2 G B空间之中。在6 4位Windows 2000中,内核终于得到了它真正需要的空间。

1. 在x86 的Wi n d o w s 2 0 0 0中获得3 G B用户方式分区

多年来,编程人员一直强烈要求扩大用户方式的地址空间。为了满足这个需要, M i c r o s o f t允许x 8 6的Windows 2000 Advanced Server版本和Windows 2000 Data Center版本将用户方式分区扩大为3 G B。若要使所有进程都能够使用3 G B用户方式分区和1 G B内核方式分区,必须将/ 3 G B开关附加到系统的B O O T. I N I文件的有关项目中。表1 3 - 1中的“3 2位Windows 2000(x 8 6w / 3 G B用户方式)”这一列显示了使用3 G B开关时它的地址空间是个什么样子。

在M i c r o s o f t添加/ 3 G B开关之前,应用程序无法看到设置了高位的内存指针。一些有创意的编程员自己将这个高位用作一个标志,这个标志只对他们的应用程序具有意义。这时,当应用程序访问内存地址时,运行的代码将在内存地址被使用之前清除该指针的高位。可以想象,当应用程序在3 G B的用户方式环境中运行时,该应用程序转眼之间就会运行失败。

M i c r o s o f t不得不提出一个解决方案,以便使该应用程序能够在3 G B环境中运行。当系统准备运行一个应用程序时,它要查看该应用程序是否与/ L A R G E A D D R E S S AWA R E链接程序开关相链接。如果是链接的,那么应用程序就声称它并没有对内存地址执行什么特殊的操作,并且完全准备充分利用3GB 用户方式地址空间。另一方面,如果该应用程序没有与/ L A R G E A D D R E S S AWA R E开关相链接,那么操作系统将保留0 x 8 0 0 0 0 0 0 0至0 x B F F F F F F F之间的1 G B区域。这可以防止在已经设置了高位的内存地址上进行内存分配。



注意,内核已经被紧紧地压缩到了一个2 G B的分区中。当使用3 G B的开关时,内核勉强地被放入一个1 GB的分区中。使用/ 3 G B的开关,可以减少系统能够创建的线程、堆栈和其他资源的数量。此外,系统最多只能使用1 6 G B的R A M,而通常情况下最多可以使用6 4 G B的R A M,因为内核方式中没有足够的虚拟地址空间可以用来管理更多的R A M。

注意当操作系统创建进程的地址空间时,需要检查一个可执行的L A R G E A D D R ES S AWA R E标志。对于D L L,系统则忽略该标志。在编写D L L时,必须使之能够在3G B用户方式分区中正确地运行,否则它们的行为特性是无法确定的。

读书人网 >C语言

热点推荐