草庐IT

C++ 将 lambda 函数保存为没有函数指针的成员变量以进行优化

我想用C++编写一个将lambda函数保存为成员变量的类。尽可能高效地做到这一点会很棒。例如,我阅读了这个线程Whycanlambdasbebetteroptimizedbythecompilerthanplainfunctions?因此我想避免使用函数指针。到目前为止,我最好的解决方案如下:templateclassLambdaClass{private:FlambdaFunc;public:LambdaClass(F&_lambdaFunc):lambdaFunc(_lambdaFunc){}};我会按如下方式使用这个类:autolambdaFunc=[](int_a)->int{

c++ - 如果函数内联过于激进会怎样?

每次我读到C++中的inline关键字时,都会有很长的解释说明编译器会进行“速度与代码量”分析,然后决定是否在每种特定情况下内联函数调用。现在VisualC++9有一个__forceinlinekeyword这似乎使编译器内联对函数的调用,除非这种内联是绝对不可能的(就像调用是虚拟的)。假设我在不了解其中内容的情况下浏览了一些项目,然后自己决定三分之一的函数足够小并且适合内联,并用__forceinline标记它们,编译器确实内联它们,现在可执行文件已经变大了一百倍。这真的很重要吗?过度内联函数并使可执行文件大一百倍,我应该期待什么效果? 最佳答案

提高性能的 C++ 内联方法

很久以前我就被告知要通过使用关键字inline并将函数体写入头文件中来制作经常内联调用的短函数/方法。这是为了优化代码,因此实际函数调用不会产生开销。今天看起来怎么样?现代编译器(在本例中为VisualStudio2010)是否会自动内联如此短的函数,还是仍然“有必要”自己这样做? 最佳答案 inline一直是对编译器的提示,如今编译器在这方面大部分都自行做出决定(参见register).为了内联扩展函数,编译器必须已经看到该函数的定义。对于仅在一个翻译单元中定义和使用的函数,这没有问题:在使用之前将定义放在某个地方,编译器将决定是

c++ - 如何用支持 __LINE__ 和 __FILE__ 的内联函数替换我的 C++ 异常宏?

我目前正在阅读ScottMeyers的《EffectiveC++》一书。它说对于类似函数的宏,我应该更喜欢inline函数而不是#define。现在我尝试编写一个内联函数来替换我的异常宏。我的旧宏看起来像这样:#define__EXCEPTION(aMessage)\{\std::ostringstreamstream;\stream我的新内联函数是这样的:inlinevoid__EXCEPTION(conststd::stringaMessage){std::ostringstreamstream;stream可能有些人已经预料到,现在__FILE__和__LINE__宏没用了,因为

c++ - 确定所有由 g++ 内联的函数调用

这个问题在这里已经有了答案:Howwilliknowwhetherinlinefunctionisactuallyreplacedattheplacewhereitiscalledornot?(10个答案)关闭8年前。我正在尝试诊断一个奇怪的性能问题,我认为它与GCC未能在C++中内联某些函数调用有关,但我不确定是哪个函数调用。GCC是否有一个标志来列出执行内联的所有行号?

c++ - 当对象具有值语义时,在方法中内联虚函数

考虑以下带有模板方法设计模式的代码:classA{public:voidtemplateMethod(){doSomething();}private:virtualvoiddoSomething(){std::cout我想知道编译器是否能够在情况1和情况2中内联/取消虚拟化“doSomething()”成员函数。如果它为templateMethod()创建3段不同的二进制代码,这是可能的:一段没有内联,2段内联了A::doSomething()或B::doSomething()(在情况3中必须分别调用,1和2)你知道这个优化是否是标准所要求的,或者是否有任何编译器实现了它?我知道我可

c++ - 在 Visual Studio 中使用 C++17 静态内联成员时的奇怪行为

昨天我问了一个关于这个问题的问题,但是没能给出一个MVCE。我设法用一个简单的程序重现了这一点。问题在于使用std::list作为类中的静态内联声明。MicrosoftVisualStudio不支持这个新的C++17功能。截至3月,它有一些错误,但据我所知,它们已被修复。以下是如何解决此问题的说明,这发生在Debug模式下。在main.cpp#include#include"header1.h"intmain(){return0;}在header1.h中:#includestructBoo{staticinlinestd::listmylist;};在另一个CPP.cpp#includ

c++ - 继承和内联?

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

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++代码工作。例如,可以将变量列表传递给带有省略号的内联代码,就像它们