草庐IT

c++ - 如何检查返回值优化是否发生?

考虑这个函数:std::stringmyClass::myFunction2(){std::stringresult=myClass::myFunction1();returnresult;}我希望编译执行returnvalueoptimization.我如何确保这确实发生了,并且代码不会冗余地复制结果? 最佳答案 如果可能,总是应用RVO。对于您的情况,假设myFunction1()不会根据执行路径返回不同的命名对象,编译器应该执行RVO。如果它返回具有不同执行路径的不同命名对象,则编译器无法执行优化。我建议您自己做实验:要在所有

c++ - 有没有办法强制 C++ 编译器不优化静态库中的特定静态对象?

(如果找不到通用的解决方案,只需要为gcc5.4工作)我有一个通用工厂,用于根据某些键(例如表示类名的字符串)构造对象。工厂必须允许注册在构造时可能不知道的类(因此我不能简单地显式注册类列表)。作为注册这些键及其相关构造函数的方法,我有另一个“RegisterInFactory”(模板化)类。在每个类的源文件中,我在对应于该类的匿名namespace中构造一个对象。这样,一旦构建了全局对象,每个类就会自动注册到工厂。除了执行此初始注册任务之外,这些对象永远不会被使用或引用。然而,当代码被编译成一个静态库,当那个库被链接到一个可执行文件时,这些静态对象永远不会被构造,所以这些类不会注册到

c++ - 为什么 GCC 不允许我创建 `inline static std::stringstream` ?

我会直接去MCVE:#includestructA{inlinestaticstd::stringstreamss;};海湾合作委员会7.2和7.1refusetocompile它有以下错误:error:nomatchingfunctionforcallto'std::__cxx11::basic_stringstream::basic_stringstream()'inlinestaticstd::stringstreamss;^~Infileincludedfromblah:1:0:/opt/compiler-explorer/gcc-7.2.0/include/c++/7.2.0

c++ - 当 -std=c++17 在编译器输出中时,编译器请求通过使用 -std++17 标志为 std::variant 启用 c++17 支持

前段时间我在让std::variant在QtCreator项目中工作时遇到了问题,在这里面临类似的提示:Can'tusec++17featuresusingg++7.2inQtCreator我解决了这个问题,并且在这个项目上已经愉快地工作了一段时间,没有进一步的问题。这是在ubuntu14.04上运行的,使用GCC7.2.0构建,也在clang5.0下构建。两天前,我备份了所有内容,安装了最新的QtCreator,再次安装了我的所有工具(gcc7.2.0和clang5.0),检索了我的项目并尝试构建。构建失败,说明:/usr/include/c++/7.2.0/bits/c++17_w

c++ - 实例化模板参数的参数包

我想制作一个模板,它接受一组模板并使用相同的参数包实例化它们。不幸的是,我似乎无法弄清楚如何在模板参数包中扩展参数包。如何编译?#include#includetemplatetypename...Args>structTupleTupleMaker{templateusingNewTupleTuple=typenamestd::tuple...>;};templateusingtuple1=std::tuple;templateusingtuple2=std::tuple;usingexpected=std::tuple,std::tuple>;usingactual=TupleTu

c++ - C++ 中的无范围枚举、枚举器和底层类型歧义

我正在浏览C++标准n4713.pdf。考虑以下代码:#include#includeenumUEn{EN_0,EN_1,EN_L=0x7FFFFFFFFFFFFFFF//EN_Lhastype"longint"};//UEnhasunderlyingtype"unsignedlongint"intmain(){longlng=0x7FFFFFFFFFFFFFFF;std::cout::type>::value以上代码输出(在g++-8.1,Clang上测试):typeof(unsignedlong==UEn):truesizeof(EN_L):8sizeof(unsigned):4s

c++ - 在ubuntu上用不同版本的gcc编译会产生不同的结果

所以我有一个像这样的项目设置:myfile.cpp包括:fsl_clock.h其中myfile是一个C++文件,fsl_clock.h是来自NXP的纯C头文件,其中可以看到它的一个版本here我的文件看起来像:#include"fsl_clock.h"现在我的文件中确实有更多内容,但我清空了它,直到只剩下这些内容为止。以下是我尝试过的编译结果:用arm交叉编译器arm-none-eabi-g++这编译得很好。使用主机(x86Linux)g++--version7.3.0-16ubuntu3它工作正常使用主机(x86Linux)g++--version7.3.0-27ubuntu1~18

c++ - 是否可以在 gcc 3.3+ 中以旧方式使用 __func__? (C++)

对于3.3之前的gcc版本和MS编译器,我使用以下宏:DEBUG_WARNING(...)printf(">WARNING:"__FUNCTION__"()"__VA_ARGS__);使用:DEBUG_WARNING("someFunctionreturned%d",ret);输出:>WARNING:Class::FunctionName()someFunctionreturned-1当我们有很多系统时,它非常方便,所有系统都发送输出。它是一个单行宏,允许我们相应地过滤输出。小代码,大用途,快乐我。由于__FUNCTION__(和C++中的__func__)定义发生了变化(我相信是为了

c++ - 接口(interface)开销

我有一个看起来像Boost.Array的简单类。有两个模板参数T和N。Boost.Array的一个缺点是,每个使用这种数组的方法都必须是带有参数N的模板(T可以)。结果是整个程序往往是一个模板。一个想法是创建一个仅依赖于T(类似于ArrayInterface)的接口(interface)(只有纯虚函数的抽象类)。现在每个其他类都只访问接口(interface),因此只需要模板参数T(与N相比,它或多或少总是已知的)。如果使用接口(interface),这里的缺点是虚拟调用的开销(更多的是错过了内联调用的机会)。直到这里只有事实。templateclassArrayInterface{p

c++ - 我可以让 gcc 链接器创建一个静态库吗?

我有一个包含大约300个c++文件的库。使用库的程序不想动态链接到它。(由于各种原因,但最好的一个是某些支持的平台不支持动态链接)然后我使用g++和ar创建一个静态库(.a),这个文件包含所有这些文件的所有符号,包括库不想导出的符号。我怀疑将消耗程序与该库链接会花费不必要的长时间,因为.a中的所有.o文件仍然需要解析它们的引用,并且链接器有更多符号要处理。创建动态库(.dylib/.so)时,您实际上可以使用链接器,它可以解析所有库内符号,并仅导出库想要导出的那些。然而,结果只能在运行时“链接”到使用程序中。我想以某种方式获得动态链接的好处,但使用静态库。如果我的谷歌搜索是正确的,认为