首先,我想陈述一下我所知道的关于“内联”的事实,这样您就不必费心去重述它们了。内联函数是一种特殊的函数,其定义必须在使用该函数的每个翻译单元中可用。这是对编译器的提示(它可以随意忽略)忽略函数调用,并展开主体而不是调用。我所知道的唯一优点是(2.)可以使代码更快。我知道的唯一缺点是(1.)增加了不好的耦合。现在让我们考虑模板。如果我有一个模板库,我需要在每个翻译单元中提供功能模板的定义,对吗?让我们暂时忘掉有争议的“导出”,因为它并没有真正解决问题。所以,我得出的结论是,没有理由不将模板函数制作成内联的,因为我所知道的内联的唯一缺点是先验。如有错误请指正。提前致谢。
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:BenefitsofinlinefunctionsinC++?有什么区别#includeusingnamespacestd;intexforsys(int);voidmain(){intx;cout>x;cout和#includeusingnamespacestd;intexforsys(int);voidmain(){intx;cout>x;cout我猜这两个定义对于代码来说是一样的,那么使用内联函数定义有什么好处呢?
内联有两点:如果编译器确定函数不能内联,则inline关键字将被忽略。有一个编译器优化(在VisualStudio上,我不知道GCC)告诉编译器尽可能内联所有函数。由此我得出结论,我永远不需要为内联操心。我只需为发布版本打开编译器优化。或者在某些情况下,手动内联是首选? 最佳答案 inline关键字有两个作用:它作为编译器执行内联优化的提示(这在现代编译器上基本上没用,现代编译器无论有无关键字都积极内联)它告诉编译器/链接器忽略单一定义规则:inline符号可以在多个翻译单元中定义(通常是因为它是在header中定义的,该heade
是否有关于如何将Webkit移植到新平台的综合文档?我对事物的JavaScript方面特别感兴趣。 最佳答案 在webkit的官方网站上,wiki上有一个HowToPort部分,定义非常明确。(http://trac.webkit.org/wiki/SuccessfulPortHowTo)(http://trac.webkit.org/wiki/WikiStart) 关于javascript-Webkit移植指南,我们在StackOverflow上找到一个类似的问题:
我想在我制作的游戏中支持非常大的世界。这通常不是问题,因为我可以剔除大部分世界,因为它不是一次可见的。然而,Box2D似乎并不喜欢我的想法!我的地形目前由大约1000个边缘形状组成。但是,仅此一项似乎就可以正常工作:即使在我只添加了几个(~25)个动态对象(小圆圈)之后,性能也在急剧下降!为什么会这样,动态树应该取消所有未受影响的静态地形很早就形成了没有性能损失,不应该吗?(如何)我可以解决这个问题? 最佳答案 答案是因为边缘形状不会与其他边缘形状发生碰撞。来自手册:Edgeshapesarelinesegments.Thesear
我在box2d中有一个任意深度的物体树结构。当父实体与任何物体发生碰撞时,它应该移动它的子实体。另一方面,如果child因碰撞而移动,则不应触摸parent。一个实体可以同时是一个实体的父实体和另一个实体的子实体。有没有办法在Box2D中实现它?似乎没有一个关节能够代表这一点,因为它们都是对称的。 最佳答案 是的。从算法上讲,使用概念上嵌套的世界。这里有一些伪代码。您需要填写详细信息,例如将主体设置为动态以及密度应该是多少。但希望代码显示了一种完成此操作的方法:externvoidrender(b2World&world,b2Vec
如果表达式的类型不相关,但我们用它来初始化静态自动变量,会发生什么?GCC和Clang的行为不同templatestructA{staticinlineautox=sizeof(T{}.f);};Aa;GCC不会引发错误。但是Clang认为这是无效的,因为它实例化了“sizeof”的操作数。GCC似乎跳过了该步骤,因为sizeof(T{}.f)始终具有类型size_t(不依赖于类型),因此它已经知道x没有实例化。如果我们引用x,例如(void)a.x;,两个编译器都会拒绝该程序。它甚至必须解析x的类型吗?如果我没记错的话,C++14以上的语言允许使用“占位符类型”保留事物(如函数)并进
我正在尝试extern一个内联函数。我认为它应该如何工作://a.cppinlinevoidf(int){}//b.cppexternvoidf(int);intmain(){f(4);}但是出现链接错误。然后通过阅读this("1)它必须在每个翻译单元中声明为内联。")。我试过的://a.cppinlinevoidf(int){}//b.cppexterninlinevoidf(int);intmain(){f(4);}仍然收到链接错误。但是现在,尝试一些我不知道自己在做什么的事情://a.cppexterninlinevoidf(int){}//b.cppexterninlinev
我想我完全理解C++中inline关键字的含义。具体来说,它意味着两个半相关的事情:对于声明为inline的函数放宽了ODR规则。因此,您可以在多个TU中定义相同的功能符号,而不会在链接它们时出现错误。这允许在header中定义函数。这是对编译器的一个建议,它应该用函数编译代码的拷贝替换函数的调用,而不是对地址的调用指令函数符号。我可以理解这两个含义在一个方向上必然相关:2必须暗示1。#2要求函数定义对所有调用该函数的TU可用。因此函数定义必须存在于多个TU中。因此需要放宽ODR以避免链接器错误。但我的问题是关于另一个方向-为什么语言设计为1必须暗示2?在某些情况下和对于某些设计决策,
代码:点3f.hClassPoint3f{...inlinevoidproject2D(ProjTypep,constPoint2i&view)const;};点3f.cppinlinevoidPoint3f::project2D(ProjTypep,constPoint2i&view)const{switch(p){casePROJ_XY:glVertex2f(x*view.x,y*view.y);break;casePROJ_YZ:glVertex2f(y*view.x,z*view.y);break;casePROJ_XZ:glVertex2f(x*view.x,z*view.y