草庐IT

c++ - 继承和内联?

我最近一直在阅读大量书籍,在涉及继承(和虚函数)的同时,我不断地遇到“内联”关键字。现在我知道内联在正常意义上是什么了——编译器可能会用确切的代码替换函数调用。然而,我看到它提到的关于继承的次数——在继承中使用内联是否有一些特殊的原因?我不明白为什么一直提到它....内联函数在继承/派生类/虚函数中有什么额外的作用? 最佳答案 是的,在虚函数上使用内联是浪费时间。必须通过由函数指针组成的虚函数表来调用虚函数。指针不能调用内联函数。它必须作为一个真正的函数存在。有一些异常(exception)。如果调用者知道确切的对象类型,它可以完全

c++ - 获取内联定义的友元函数的地址

考虑以下代码:#includestructfoo{friendvoidbar(foo){}voidfoobar(){std::coutgcc给我这个错误:main.cpp:Inmemberfunction'voidfoo::foobar()':main.cpp:7:23:error:'bar'wasnotdeclaredinthisscopestd::cout那是因为bar是类本身定义的友元函数,使其在全局命名空间中不可见。访问它的唯一方法是通过ADL,但我还没有找到使用ADL获取bar地址的方法。所以我的问题是,如何获取bar的地址?除了在foo之外定义bar之外,还有其他方法吗?

友元函数的 C++ 内联定义

在C++标准的当前草案中(2019年3月)[class.friend]p.6状态(强调我的):Afunctioncanbedefinedinafrienddeclarationofaclassifandonlyiftheclassisanon-localclass([class.local]),thefunctionnameisunqualified,andthefunctionhasnamespacescope.[...]“函数具有命名空间作用域”是什么意思?我能想到的函数没有命名空间作用域的唯一情况如下:structA{staticvoidf();structB{friendvoi

c++ - 内联汇编程序调用子程序

我对内联汇编程序有疑问。可以在同一个函数中从内联汇编程序调用另一个汇编程序子例程吗?例如:voidFindValidPID(unsignedint&Pid){__asm{subesp,20hmoveax,Pidaddeax,eaxcallsub123;anotherassmsubroutinemovPid,eaxaddesp,20h}}我应该在哪里以及如何编写子例程sub123?干杯,托马斯 最佳答案 如果您在汇编中编写整个子例程,您应该考虑使用文件级汇编器而不是内联。 关于c++-内联

c++ - c/c++ 优化调用函数中的常量变量

C/C++编译器仅在使用-Os、-O1和-O2时使用常量参数(在编译时已知)优化单层函数。他们不会优化所有层。只有-O3可以做到这一点。gcc是不支持“优化”属性的WinAVR4.3.3。voidinner(doublevalue){//operationsusingvalue//...}voidouter(doublevalue){//fewoperationsusingvalue//...inner(value);}intmain(){inner(1);//optimizeouter(1);//onlyoptimizebyusing-O3}除了以下几种可能的解决方案还有哪些?-O3

c++ - 如何将数组从 perl 传递到内联 C++?

我不知道这是一个错误还是什么。以下代码适用于Inline::C但不是Inline::CPP#!/usr/bin/perlusewarnings;useInlineC;my@array=(1..10);printfindAvLen(\@array),"\n";__END____C__intfindAvLen(AV*arrayIn){returnav_len(arrayIn);}以上运行正常,但替换C与CPP,我收到错误Can'tlocateauto/main/findAvLen.alin@INC...我可以让其他内联C++代码工作。例如,可以将变量列表传递给带有省略号的内联代码,就像它们

c++ - 非限定名称查找找到内联命名空间成员

我写了下面的代码:#includeinlinenamespaceM{intj=42;}intmain(){std::cout而且效果很好。但我预计该程序格式错误。这是因为标准说(N3797,第7.3.1/7节):Finally,lookingupanameintheenclosingnamespaceviaexplicitqualification(3.4.3.2)willincludemembersoftheinlinenamespacebroughtinbytheusing-directiveeveniftherearedeclarationsofthatnameintheencl

c++ - 使用内联的显式模板函数实例化

因此,我和一位同事一直在讨论显式模板实例化在减少编译时间、将声明与定义分开以及不影响我编写的用于其他项目的C++数学库的性能方面的好处。本质上,我有一个有用的数学函数库,旨在与Vector3、Vector4、Quaternion等原语一起使用。所有这些都用于模板参数为float或double(在某些情况下为int).这样我就不必将这些函数写两次,一次用于float,一次用于double,函数实现是模板化的,如下所示:templateVector3foo(constVector4&a,constQuaternion&b){dosomething...}全部在.h文件中定义(因此它们被隐式

c++ - 内联类函数和共享库 (dll) 构建

我正在尝试将一些代码移动到共享库中(在独立编译时工作正常)但遇到了类内联函数的一些问题。mingw/gccv4.7.2.部分问题似乎是因为我更喜欢在类声明之外定义我的内联函数(它使类声明更整洁且更易于阅读)。我一直认为这是可以接受的,相当于在类声明中定义……但情况似乎并非总是如此。我创建了一个简单示例来演示这些问题。(显然,dllexport通常在宏中以在导入/导出之间切换。)标题://Uncommentoneatatimetoseehowitcompileswith:-O2-Winline//#defineINLINE_OPTION1//implicit-buildswithouti

c++ - 调用常量指向成员函数的指针未被内联

现在,我知道没有内联保证,但是......鉴于以下情况:structBase{virtualintf()=0;};structDerived:publicBase{virtualintf()finaloverride{return42;}};externBase*b;我们有:intmain(){returnstatic_cast(b)->f();}编译为:main:movl$42,%eaxret然而...intmain(){return(static_cast(b)->*(&Derived::f))();}编译为:main:pushl%ebpmovl%esp,%ebpandl$-16,