草庐IT

c++ - g++ -O3 比 -O2 优化得更好,添加了所有额外的优化

这个问题在这里已经有了答案:What'sthedifferencebetween-O3and(-O2+flagsthatmangccsays-O3addsto-O2)?(2个答案)关闭8年前。这是我正在查看的函数:templateinlineuint64_tparseUnsigned(constchar(&buf)[Size]){uint64_tval=0;for(uint8_ti=0;i我有一个测试工具,它传递所有可能的数字,其中Size=5,左边用空格填充。我正在使用GCC4.7.2。当我在使用-O3编译后在callgrind下运行程序时,我得到:Irefs:7,154,919当我

c++ - 为什么 g++ 从带有转换运算符和不可访问的函数调用运算符的类型中初始化 std::function<> 失败?

此代码在g++4.9及更高版本(包括从svncurrent构建)中失败,但在没有警告的情况下使用clang++和Microsoft编译器(来自VS2015。)编译#includestructA{voidoperator()()const{}};structB{voidoperator()()const{}};structC:privateA,privateB{operatorstd::function()const{returnnullptr;}};intmain(){std::functionf{C{}};}main()中f的构造失败,因为operator()在structC中不明确

c++ - 具有 k 个 1 位的最小 n 位整数 c 是两个 g、h 位设置为 1 的 n 位整数之和(动态规划)

我正在尝试解决以下问题:Findthesmallestn-bitintegercthathask1-bitsandisthesumoftwon-bitintegersthathaveg,hbitssetto1.g,h,k首先,这里的n位整数意味着我们可以使用所有n位,即最大。这样一个整数的值是2^n-1。所描述的整数可能根本不存在。很明显k>g+h没有解,对于g+h=k答案就是2^k-1(前k位为1位,k-n前面为零)。至于程序应该做什么的一些例子:g=h=k=4,n=10:0000001111+0000001111=000001111015+15=30(30shouldbetheou

c++ - GCC/g++ cout << 与 printf()

为什么printf("helloworld")最终在汇编代码中使用了比cout更多的CPU指令(不考虑使用的标准库)?对于C++,我们有:movl$.LC0,%esimovl$_ZSt4cout,%edicall_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc对于C:movl$.LC0,%eaxmovq%rax,%rdimovl$0,%eaxcallprintfC++代码中的第2行和C代码中的第2,3行有什么用?我正在使用gcc4.5.2版 最佳答案 对于Linuxx86

c++ - 让 g++ 对未初始化的 POD 成员变量发出警告

如果您忘记在ctor初始化列表中声明成员POD,是否有办法打印警告?我正在查看文档,但找不到任何东西。g++-4.4在这里。 最佳答案 您可以启用-Weffc++以获得一堆荒谬的警告,包括每个非ctor初始化的成员。要检查实际UB,请使用valgrind。 关于c++-让g++对未初始化的POD成员变量发出警告,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6766397/

C++11/g++:lambda 中需要 std::qualifier,尽管给出了 "using namespace std"

我试图发现新的C++11标准(使用g++4.6.2)的一些优点。在“all_of”算法函数中使用lambda时,我遇到了一个关于std::限定符的奇怪问题。我正在“使用”代码片段开头所示的std命名空间。这使得for循环中pair变量的声明定义明确。但是,我在“all_of”算法中使用的lambda参数中尝试了相同的方法。在我意识到完整的std::合格的std::pair可以在那里工作,但只有pair不行之前,我遇到了几个难以理解的错误消息。我是否遗漏了重要的一点?lambda的声明发生在这个文件中,所以命名空间在这里应该仍然有效,对吧?或者所需的std::限定符是否依赖于不同文件中的

c++ - 为什么这个基本线程程序会因 Clang 而失败,但会通过 g++?

我有一个使用线程的简单程序。在Clang中,我遇到了一堆令人困惑的无关错误。这是程序:#include#include#includeintmain(){std::packaged_tasktask([]{return1;});std::futureresult=task.get_future();task();std::cout错误:error:nomatchingconstructorforinitializationof'duration'(aka'std::chrono::duration>'):_d(_t.time_since_epoch())note:ininstantia

c++ - 为什么 g++ 不生成 "raw"符号?

从C语言我们知道什么是合法的变量名。合法名称的一般正则表达式类似于[\w_](\w\d_)*。使用dlsym我们可以加载任意字符串,并且C++manglesnamesthatinclude@intheABI..我的问题是:可以使用任意字符串吗?dlsym上的文档似乎没有提及任何内容。Anotherquestion出现的情况似乎暗示完全有可能具有任意的以null结尾的符号。这让我问以下问题:为什么g++不发出带有名称和参数列表(包括命名空间和类成员资格)的原始函数签名?我的意思是:namespacetest{classA{intmyFunction(constinta);};}names

c++ - cmake -g 标志不生成 'DWARF with dSym file' 调试信息

我正在使用cmake生成C++Xcode项目,但从未生成调试信息。每次使用cmake生成项目时,我都必须从build设置中手动选择“DWARFwithdSymfile”。使用“SET(CMAKE_CXX_FLAGS_DEBUG"${CMAKE_CXX_FLAGS_DEBUG}-g")”没有区别。我也很确定它曾经与XCode6一起正常工作(现在使用Xcode7) 最佳答案 解决方案您可以使用CMAKE_XCODE_ATTRIBUTE_*变量。要设置DWARF,您可以使用:set(CMAKE_XCODE_ATTRIBUTE_DEBUG_

c++ - 使用带有 clang++ 而不是 g++ 的 std::acos 的 Constexpr 编译错误

我想尝试将一个项目从gcc迁移到clang++。我承认我的无知,我不确定为什么会出现以下代码templateconstexprTpi{std::acos(T(-1.0))};使用g++静默编译,但clang++产生错误trig.hpp:3:13:error:constexprvariable'pi'mustbeinitializedbyaconstantexpressionconstexprTpi{std::acos(T(-1.0))};我希望比我更了解它的人可以启发我。注意:尝试使用-std=C++14和C++1y。在clang版本3.6.2(tags/RELEASE_362/fin