标签: inline-functions

自动内联JavaScript函数调用的工具?

内联JavaScript函数调用可以加快执行速度,并在gzipping之后减少代码大小,如本文所述:

http://blog.calyptus.eu/seb/2011/01/javascript-call-performance-just-inline-it/

但是,我找不到一个自动处理JS源文件并在其中内联所有(或更好的,选定的)inlinable函数调用的工具.谷歌的Closure Compiler做了一些内联,但并不总是,也不是可配置的.

提前致谢!

javascript inline-functions

11
推荐指数
1
解决办法
2195
查看次数

为什么有时在类中定义C++方法?

我经常在C++中遇到大型的非模板类,其中简单的方法直接在头文件的类体中定义,而不是在实现文件中单独定义.例如:

class Foo {
  int getBar() const { return bar; }
  ...
};
Run Code Online (Sandbox Code Playgroud)

为什么这样?好像有缺点.实现不是应该隐藏的,代码不太可读,如果类的头文件包含在许多不同的地方,编译器的负担也会增加.

我的猜测是人们打算在其他模块中内联这些功能,这可以显着提高性能.但是,我听说较新的编译器可以跨模块在链接时进行内联(和其他过程间优化).对这种链接时优化的支持有多广泛,它是否真的不需要这些定义?这些定义还有其他充分的理由吗?

c++ compiler-construction optimization inline-functions

10
推荐指数
2
解决办法
1671
查看次数

由于源文件中存在未执行的代码而运行应用程序时崩溃 - c ++

我正在研究一个非常棘手的问题,我现在已经花了一个星期了.我撞到了一堵非常坚硬的墙壁,我的前额因敲打而受伤,所以我希望有人可以帮助我.

我正在使用Visual Studio 2005进行此项目 - 我已经安装了2008但在尝试时遇到了类似的问题.

我们有一个目前正在针对OpenCv1.1编译的应用程序,我正在尝试将其更新为2.2.当我们将静态链接切换到新库时,应用程序崩溃 - 但仅在发布模式下.所以动态链接和调试都可以正常工作.

std::vector打电话时崩溃了push_back.

然后我想出了一个示例测试应用程序,它在opencv中运行一些基本代码,工作正常,然后使用完全相同的代码并将其添加到我们的应用程序中.那段代码失败了.

然后我掏空了应用程序,因此它没有实例化任何代码对象,除了主要的gui和1类调用该代码并且它仍然崩溃.但是,如果我直接在主gui中运行该代码,它运行正常.

然后我开始评论大量的应用程序(在永远不应该实例化的组件中),最后我向下工作直到......

我有一个有方法的类

void Foo()  
{  
    std::vector<int> blah;  
    blah.begin();  
}  
Run Code Online (Sandbox Code Playgroud)

如果在头文件中定义了此方法,则测试代码可以正常工作,但如果在cpp文件中定义了此代码,则会崩溃.此外,如果我使用std::vector<double>而不是int,它也有效.

然后我尝试使用编译器选项,如果我关闭优化(/ Od)并将内联函数扩展设置为仅__inline(/ Ob1),它甚至可以在cpp文件中使用代码.

当然,如果我们回到未经批准的应用程序并自行更改这些编译器选项,它就会崩溃.

如果有人对此有任何见解,请告诉我.

谢谢,Liron

c++ opencv visual-studio-2005 std inline-functions

10
推荐指数
2
解决办法
686
查看次数

内联C++代码

以下代码有什么区别:

class Foo  
{
  inline int SomeFunc() { return 42; }
  int AnotherFunc() { return 42; }
};
Run Code Online (Sandbox Code Playgroud)

两个函数都会被内联吗?内联实际上有什么区别吗?关于何时应该或不应该内联代码,是否有任何规则?我经常使用AnotherFunc语法(例如访问器),但我很少inline直接指定.

c++ inline-functions

9
推荐指数
3
解决办法
2920
查看次数

C99内联的理念是什么?

inline在C99 感到困惑.

这就是我想要的:

  1. 我希望我的函数在任何地方都被内联,而不仅仅局限于一个翻译单元(或一个编译单元,一个.c文件).
  2. 我希望函数的地址一致.如果我在函数指针中保存函数的地址,我希望函数可以从指针调用,我不希望在不同的翻译单元中重复相同的函数(基本上,我的意思是没有static inline).

C++就是inline这样做的.

但是(如果我错了请纠正我)在C99中没有办法得到这种行为.

我可以使用static inline,但它会导致重复(不同翻译单元中相同功能的地址不一样).我不希望这种重复.

所以,这是我的问题:

  1. inlineC99的理念是什么?
  2. 这个设计对C++的方法有什么好处?

参考文献:

  1. 这是一个高度评价C99的链接inline,但我不明白为什么.这只"仅在一个编译单元中"限制真的那么好吗?
    http://gustedt.wordpress.com/2010/11/29/myth-and-reality-about-inline-in-c99/
  2. 这是C99的基本原理inline.我读过它,但我不明白.
    没有"静态"或"外部"的"内联"在C99中是否有用?
  3. 一篇不错的文章,提供了使用inline函数的策略.
    http://www.greenend.org.uk/rjk/tech/inline.html

答案摘要

如何inline在C99中获得C++ 行为(是的,我们可以)

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

inline int my_max(int x, int y) {
    return (x>y) ? (x) : (y);
}

void call_and_print_addr();

#endif
Run Code Online (Sandbox Code Playgroud)

src.c

#include "head.h"
#include <stdio.h>

// This is necessary! And it should occurs and only occurs …
Run Code Online (Sandbox Code Playgroud)

c c99 extern inline-functions

9
推荐指数
1
解决办法
511
查看次数

GCC编译器内联的深度

我研究过那个

内联说明符是编译器的一个提示,它应该尝试生成代码内联,而不是为函数设置一次代码,然后通过通常的函数调用机制调用.

问题:

  1. 如果关闭GCC编译器的优化,是否忽略内联说明符?
  2. 当内联函数被递归调用时,哪个编译器选项确定"内联深度",直到它遵循正常的函数调用机制?
  3. 如果在for循环中调用内联函数,那么相同的"内联深度"是否会进入图片中?

c++ optimization gcc inline-functions

8
推荐指数
1
解决办法
1089
查看次数

什么时候"内联"关键字在C中有效?

那么,标准无法保证inline函数实际内联; 必须使用宏才能获得100%的保证.无论inline关键字如何,编译器总是根据自己的规则决定哪个函数内联或不内联.

那么,inline当使用现代编译器(如最新版本的GCC)时,关键字何时会对编译器的作用产生什么影响?

c inline-functions

8
推荐指数
1
解决办法
267
查看次数

具有内部链接的内联函数?

在C中:为什么只有具有内部链接的内联函数(即用static声明)可以在具有静态存储持续时间的文件范围内引用(即复制地址,读取,写入或调用)变量或函数,而其他内联函数可能不会?

c inline-functions

7
推荐指数
1
解决办法
2963
查看次数

内联函数在不同的转换单元中具有不同的编译器标志未定义的行为?

在visual studio中,您可以为各个cpp文件设置不同的编译器选项.例如:在"代码生成"下,我们可以在调试模式下启用基本运行时检查.或者我们可以改变浮点模型(精确/严格/快速).这些只是一些例子.有很多不同的旗帜.

只要定义相同,就可以在程序中多次定义内联函数.我们将此函数放入标题中并将其包含在多个翻译单元中.现在,如果不同的cpp文件中的不同编译器选项导致该函数的编译代码略有不同,会发生什么?然后他们确实不同,我们有不确定的行为?你可以使函数静态(或将它放入一个未命名的命名空间)但是更进一步,直接在类中定义的每个成员函数都是隐式内联的.这意味着如果这些cpp文件共享相同的编译器标志,我们可能只包含不同cpp文件中的类.我无法想象这是真的,因为这基本上是容易出错.

我们在未定义行为的土地上真的那么快吗?还是编译器会处理这种情况?

c++ one-definition-rule inline-functions language-lawyer translation-unit

7
推荐指数
1
解决办法
429
查看次数

即使没有明确定义为内联,一个非常短的函数是否可以内联?

我事先知道,当用C或C++编写程序时,即使我将函数声明为"内联",编译器也可以自由地忽略它并决定不在每次(或任何)调用时展开它.

反之亦然吗?也就是说,如果编译器认为这样做会导致性能提升,编译器是否可以自动内联一个非定义为内联的非常短的函数?

另外两个子问题:这种行为是在ANSI标准的某处定义的吗?在这方面C是否与C++不同,或者它们的行为是否相同?

c c++ inline-functions

6
推荐指数
1
解决办法
250
查看次数