我刚刚开始使用Linux上的g ++编译器,并对编译器标志有一些疑问.他们是这样的
优化
我阅读了有关优化标志的内容-O1,-O2并-O3在g ++手册页中.我不明白何时使用这些标志.通常你使用什么优化级别?g ++手册说明了以下内容-O2.
优化甚至更多.GCC几乎执行所有支持的优化,不涉及空速 - 权衡.指定-O2时,编译器不执行循环展开或函数内联.与-O相比,此选项增加了编译时间和生成代码的性能.
如果它没有进行内联和循环展开,那么如何实现所述性能,是否建议使用此选项?
静态库
如何使用g ++创建静态库?在Visual Studio中,我可以选择一个类库项目,它将被编译成"lib"文件.什么是g ++中的等价物?
刚刚安装了Visual Studio 11开发人员预览版.在编译指定了AnyCPU目标的托管(C#,VB)应用程序时,我在项目属性中看到一个名为"Prefer 32-bit"的新选项.这似乎不是类库的选项,只是顶级应用程序.
这个标志表示什么?
我试图了解编译C代码时-pg(或-p)标志如何工作gcc.
官方gcc文档仅说明:
-pg
生成额外的代码以编写适用于分析程序gprof的配置文件信息.编译所需数据的源文件时必须使用此选项,并且在链接时也必须使用它.
这真的让我感兴趣,因为我正在对分析器进行一项小型研究 - 试图选择最适合这项工作的工具.
为什么这个程序的输出是4?
#include <iostream>
int main()
{
short A[] = {1, 2, 3, 4, 5, 6};
std::cout << *(short*)((char*)A + 7) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,在x86 little endian系统上,char有1个字节,短2个字节,输出应该是0x0500,因为数组中的数据A是十六进制的休闲:
01 00 02 00 03 00 04 00 05 00 06 00
Run Code Online (Sandbox Code Playgroud)
我们从开始向前移动7个字节,然后读取2个字节.我错过了什么?
HotSpot的分层编译使用解释器,直到调用(对于方法)或迭代(对于循环)的阈值触发具有自分析的客户端编译.使用客户端编译,直到另一个调用或迭代阈值触发服务器编译.
打印HotSpot的标志使用-XX:+ TieredCompilation显示以下标志值.
intx CompileThreshold = 10000 {pd product}
intx Tier2CompileThreshold = 0 {product}
intx Tier3CompileThreshold = 2000 {product}
intx Tier4CompileThreshold = 15000 {product}
Run Code Online (Sandbox Code Playgroud)
仅有客户端和服务器编译器的标志太多.哪些编译器由这些标志控制?如果不是客户端和服务器,其他编译器的目的是什么?
在这种情况下是否忽略CompileThreshold和Tier2CompileThreshold?触发客户端编译时Tier3CompileThreshold控制什么?触发服务器编译时Tier4CompileThreshold控制什么?
对于GCC CFLAGS选项:-msse,-msse2,-mssse3,-msse4,-msse4.1,-msse4.2.它们是独家使用还是可以一起使用?
我的理解是,选择要设置的位置取决于程序将运行的目标拱,是否支持,这是正确的吗?
如果是这样,我怎么知道我的目标拱支持什么?在Linux中,我是cat/proc/cpuinfo,但是如果是mac还是Windows呢?
谢谢!
当我g++使用-Og选项编译我的C++程序时,我会看到变量<optimized out>,并且当前行有时会跳过.这种行为是期望在这个优化级别,还是我有一些问题?gcc的手册页说:
-Og
优化调试体验.-Og启用不会干扰调试的优化.它应该是标准编辑 - 编译 - 调试周期的优化级别,提供合理的优化级别,同时保持快速编译和良好的调试体验.
因此我没想到这种行为.在我的系统上,我有g ++版本4.9.2和gdb版本7.7.1.
Clang有各种消毒剂,可以在运行时开启以解决问题.
但是,有一些消毒剂我不能一起使用.这是为什么?
clang++-3.9 -std=c++1z -g -fsanitize=memory -fsanitize=address -o main main.cpp 1
clang: error: invalid argument '-fsanitize=address' not allowed with '-fsanitize=memory'
Run Code Online (Sandbox Code Playgroud)
这不是什么大问题,但是当我运行单元测试时,它需要的时间比它应该的长,因为我为相同的测试创建了多个二进制文件,并分别运行它们.
clang++-3.9 -std=c++1z -g -fsanitize=address -o test1 test.cpp
clang++-3.9 -std=c++1z -g -fsanitize=memory -fsanitize=undefined -o test2 test.cpp
Run Code Online (Sandbox Code Playgroud) 我的项目包含XMPPFramework,其中包含必须与ARC一起使用的文件.但是我的项目是Non ARC,由于链接到它的某些其他库而无法转换.
如何强制编译器仅在某个类上使用ARC?
在我目前的项目中 - 我可能会在一段时间内 - 继续工作,我们已经决定使用该-Werror标志,因为我们之前的"没有警告!"政策没有达到预期的效果.
然而,这带来了一个问题:
API不能再以a)被正常构建工具链标记的方式标记为已弃用,并且b)不会破坏构建.
所以我想这个问题归结为:
有旗帜-Werror-no-${something_I_dont_want_to_promote_to_an_error}吗?
我发现#pragma clang diagnostic error到几乎达到我想要的-除了我不能赶上所有启用的警告,暗示由编译器...
提前致谢.
compiler-flags ×10
c++ ×4
g++ ×3
gcc ×3
clang ×2
build ×1
c# ×1
clang++ ×1
compilation ×1
endianness ×1
gnu ×1
gprof ×1
java ×1
jit ×1
jvm-hotspot ×1
optimization ×1
sanitizer ×1
sse ×1
vb.net ×1
xcode ×1
xmpp ×1