首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问3个C++有关问题

2013-08-10 
请教3个C++问题1. g++中的关于速度的优化是哪个,和VC++ 6.0中最快速度优化相比怎么样? 402. windows xp为

请教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用户方式分区中正确地运行,否则它们的行为特性是无法确定的。 

热点排行