我刚读到constexpr和inline函数遵循一个定义规则,但它们的定义必须相同。所以我试了一下:inlinevoidfoo(){return;}inlinevoidfoo(){return;}intmain(){foo();};错误:'voidfoo()'的重新定义,和constexprintfoo(){return1;}constexprintfoo(){return1;}intmain(){constexprx=foo();};错误:'constexprintfoo()'的重新定义那么究竟是什么意思,constexpr和inline函数可以服从ODR?
下面引自C++primer书的引述让我很困惑Unlikeotherfunction,inlineandconstexprfunctionsmaybedefinedmultipletimesintheprogram.Afterall,thecompilerneedsthedefinition,notjustthedeclaration,inordertoexpandthecode.However,allofthedefinitionsofagiveninlineorconstexprmustmatchexactly.Asaresult,inlineandconstexprfunction
好吧,我正在用R编程,我想创建一个C++函数。我已经导入了Rcpp和内联库。目前,我只是想做一个简单的函数来添加2个数字,但无论我尝试什么,我都会出错。这是我的代码:cppstring='doubless=RcppSexp(s).asDouble();returnRcppSexp(ss+4).asSexp();'hi当我输入第二行时,我得到file628a34ce.cpp:Infunction‘SEXPREC*file628a34ce(SEXPREC*)’:file628a34ce.cpp:9:error:‘RcppSexp’wasnotdeclaredinthisscopemake:
以下未能在C++14中的GCC和Clang下进行编译,但C++1Z成功:structCls{staticconstexprintN=0;};constexprintCls::N;constexprintCls::N;C++14错误是可以预见的:redefinitionof‘constexprconstintCls::N’是什么改变了这一合法?我发现:N465910.1.5[DCL.Constexpr]使用ConstexPR规范声明的函数或静态数据成员隐含是内联函数或变量所以我认为这可能与内联变量有关,但是两个编译器下的C++1Z失败structCls{staticinlineconstintN
我刚刚创建了两个文件来测试内联函数的链接,第一个#includeusingnamespacestd;inlineintf1(inta,intb){a=a+b;while(a!=0)a--;cout第二个:intmain(){externvoidf1(inta,intb);f1(1,2);}g++frist.ccsecond.ccundefinedreferenceto`f1(int,int)'链接器引发错误,因为我期望内联函数是默认的内部链接,所以结果是正确的。但是,当我将内联函数的调用函数添加到第一个文件时:#includeusingnamespacestd;inlineintf1(
从我很久以前在某处读到的,似乎如果你想在编译阶段内联类成员函数,则必须在类声明block中定义该函数。但这有一个细节泄漏的缺点。恕我直言,其他程序员在打开.h文件时应该只看到类接口(interface)。第一个语句在现代C++中是否仍然正确,曾经是吗?有没有办法强制内联声明的函数,最好是完全在另一个文件中?在类声明block中保留简短的成员函数通常更好吗? 最佳答案 Itseemsthatifyouwantclassmemberfunctiontobeinlinedduringthecompilationphase,thefunct
我想要的是一个构建配置,其中函数不内联,除了一些选定的函数(可能内联也可能不内联,那将是取决于编译器)。更好的是某种“内联级别”,我可以在其中为每个函数指定这样的级别,并在构建时加上最低级别,并且只允许内联高于最低级别的函数。我知道对此没有标准的解决方案,但同样欢迎特定于编译器的黑客攻击。我希望能够在调试器中逐步执行我的大部分非内联函数,但应该内联其中的少数函数,部分是出于性能原因,部分是为了避免超深的调用堆栈。该代码涉及一些非常讨厌的模板元编程,但该部分大部分已完成,所以我想专注于其余部分。因此,最好内联属于模板元程序的函数,而不是其他内联函数。有什么办法可以达到这样的目的吗?
我有一些非常复杂的c++代码,用于实时系统,因此对速度绝对敏感。它是在Linux上开发的,为了加快它的速度,许多函数都标有“内联”关键字,并移至头文件中以允许内联。现在我将此代码移植到Windows(msvc10.0、Windows7),它的运行速度大约慢了30%。在做了一些分析之后,我发现问题基本上是很多函数没有内联。当我改用“__forceinline”时,我很容易看到速度提高了10-20%。有人对此有解释吗?仅仅是因为msvc中的算法更加保守吗?还是我只是做错了什么,比如缺少配置选项? 最佳答案 您需要检查您的MSVC优化设置
我最近在查看一位同事的代码,注意到他在类声明中定义的一堆Getter函数前面放置了“inline”关键字。例如classFoo{public:inlineboolGetBar()const{returnm_Bar;}private:boolm_Bar;};我在代码审查中建议他删除内联关键字,正如我在许多不同的地方读到的那样,在类声明中定义函数是由编译器解释的(在这种情况下为MSVC,但显然是C++标准的一部分)作为作者想要内联函数的指示。我的感觉是,如果额外的文本没有任何作用,那只是不必要的困惑,应该删除。他的回应如下:inline关键字让与此代码交互的其他程序员清楚地知道这些函数是/
我知道编译器可能,而不是应该将内联函数展开到调用函数中,以避免与调用out-of相关的开销-行功能。不过,我也知道inline函数的链接方式与out-of-line函数不同,因此我不能指望它们以完全相同的方式运行。虽然我实际上使用的是C++,但我正在开发一个使用api的程序,在其中可以方便地使用类似于以下内容的C宏:#definefunc_alloca(ptr)do{*ptr=alloca(size);memset(*ptr,0,size);}为了不在不同的函数中多次重复代码,如果能够将一系列这些alloca调用功能化,对我来说会很有用。我的问题是,(特别是在gcc中,因为alloca