我无法理解以下行为:一个标题包含一些基本类型,另一个标题我在几个函数中使用这些类型.之后我开始根据我定义的类型和函数构建类.在函数头中,如果我留下以下签名:
void whateverFunction(parameters)
Run Code Online (Sandbox Code Playgroud)
链接器指出whateverFunction有多个定义.现在如果将其更改为:
inline void whateverFunction(parameters)
Run Code Online (Sandbox Code Playgroud)
联系问题已经消失,所有编译和链接都很好.我所知道的内联是它用它的代码替换每个函数调用,而不是它非常暗,所以我的问题是:
链接器如何处理C++中的内联函数?
我想知道是否有可能获得V8如何优化和内联的知识.
我创建了三个简单的测试函数,它们都以度为单位计算角度的正弦值.我将它们全部放入闭包中,以便V8能够内联局部变量.
1.使用预先计算的常数Math.PI / 180,然后执行Math.sin(x * constant).
我用过这段代码:
var test1 = (function() {
var constant = Math.PI / 180; // only calculate the constant once
return function(x) {
return Math.sin(x * constant);
};
})();
Run Code Online (Sandbox Code Playgroud)
2.动态计算常数.
var test2 = (function() {
var pi = Math.PI; // so that the compiler knows pi cannot change
// and it can inline it (Math.PI could change
// at any time, but pi cannot)
return function(x) {
return Math.sin(x …Run Code Online (Sandbox Code Playgroud) 看看NS_INLINE它的定义似乎使用它的优点static inline是编译器兼容性,这是正确的吗?在objective-c项目中应该NS_INLINE总是使用而不是static inlinec函数吗?
#if !defined(NS_INLINE)
#if defined(__GNUC__)
#define NS_INLINE static __inline__ __attribute__((always_inline))
#elif defined(__MWERKS__) || defined(__cplusplus)
#define NS_INLINE static inline
#elif defined(_MSC_VER)
#define NS_INLINE static __inline
#elif TARGET_OS_WIN32
#define NS_INLINE static __inline__
#endif
#endif
Run Code Online (Sandbox Code Playgroud) 我正在研究一些重的cpu绑定问题.当我使用inline关键字时,我看到了很大的性能提升.我从标准.net库创建一个字典,传入自定义密钥Comparer,请参阅下面的代码和时序结果
https://gist.github.com/4409734
在Eq_cmp上没有内联关键字
> perf_run 10000000 ;;
Real: 00:00:11.039, CPU: 00:00:11.029, GC gen0: 771, gen1: 3, gen2: 1
val it : unit = ()
Run Code Online (Sandbox Code Playgroud)
在Eq_cmp上使用内联关键字
perf_run 10000000 ;;
Real: 00:00:01.319, CPU: 00:00:01.388, GC gen0: 1, gen1: 1, gen2: 1
val it : unit = ()
>
Run Code Online (Sandbox Code Playgroud)
我还注意到Gen 0 GC与内联代码和非内联代码的巨大差异.
有人可以解释为什么会有这么大的差异吗?
我正在尝试创建一个术语定义对的定义列表,每个对都存在于一条单独的行上.我试过制作dts和dds display:inline,但后来我失去了对之间的换行符.如何确保每对都有一条线(而不是每个单独的术语/定义)?
例:
<dl>
<dt>Term 1</dt><dd>Def 1</dd>
<dt>Term 2</dt><dd>Def 2</dd>
</dl>
Run Code Online (Sandbox Code Playgroud)
收益:
Term 1 Def 1
Term 2 Def 2
Run Code Online (Sandbox Code Playgroud)
使它们内联的CSS将是:
dt,dd{display:inline;}
Run Code Online (Sandbox Code Playgroud)
收益:
Term 1 Def 1 Term 2 Def 2
Run Code Online (Sandbox Code Playgroud)
...这不是我想要的(缺少对之间的换行符).
如果你有一个方法,并且你想给编译器一个暗示它是一个好主意内联它,你目前有两个解决方案.第一个是在声明类时定义方法:
class Vector {
private:
double* data_;
double* size_;
double* capacity_;
public:
double& operator[](int k) {
return data_[k];
}
...
}
Run Code Online (Sandbox Code Playgroud)
由于此方法可能会降低可读性,另一种解决方案是使用inline关键字并在类外定义方法:
class Vector {
private:
double* data_;
double* size_;
double* capacity_;
public:
inline double& operator[](int k);
...
}
double& Vector::operator[](int k) {
return data_[k];
}
Run Code Online (Sandbox Code Playgroud)
这使得代码更具可读性(至少我更喜欢它).阅读我的STL实现,我发现他们使用了两者的混合.一些方法(我认为应该真正内联的方法)在类中定义,而其他方法则使用inline关键字在类外定义.该文件也以该类的注释声明开头.
所以我的问题如下.当前的编译器(我正在考虑GCC,Clang,Intel和Visual Studio)更有可能内联在类中声明的成员函数,而不是使用inline关键字在类外声明的成员函数?
备注:这个问题与我何时应该为函数/方法编写关键字'inline'不重复?我的问题是关于编译器实现.这两种方式表明你希望这些函数被内联是等价的.STL的编写方式表明它们不是.
考虑这种情况:
public Class1 {
public static final String ONE = "ABC";
public static final String TWO = "DEF";
}
public Class2 {
public void someMethod() {
System.out.println(Class1.ONE + Class1.TWO);
}
}
Run Code Online (Sandbox Code Playgroud)
通常,您会期望编译器内联ONE和TWO常量.但是,这种行为有保证吗?你可以在类路径中没有Class1的运行时Class2部署,并期望它无论编译器如何工作,或者这是一个可选的编译器优化?
编辑:为什么要这样做?好吧,我有一个常量,它将在应用程序的两端(通过RMI的客户端和服务器)之间共享,并且在这种特定情况下将常量放在一个只能位于该除法的一侧的类上是非常方便的(因为它在逻辑上是拥有该常量值的那个而不是将它放在任意常量类中,因为它需要由代码的两端共享.在编译时它的所有一组源文件,但在构建时它被包分开.
我从Visual Basic来到Java,似乎认为我曾经在很多方面被宠坏了:p
有没有办法实例化一个对象并内联修改它?就像是:
JFrame aFrame = new JFrame();
aFrame.add(new JPanel() {.setSize(100,100) .setLocation(50,50) .setBackground(Color.red) });
Run Code Online (Sandbox Code Playgroud)
我能够使用@Override方法,但我正在寻找更简单的方法.我有很多搜索,但是如果有这种内联实例化的特定术语,它就会让我失望.
感谢您的时间!
标准说,给出声明
inline void foo();
Run Code Online (Sandbox Code Playgroud)
这foo是一个带有外部链接的内联函数(因为默认情况下所有函数声明都有外部链接).这让我很奇怪.因为一个定义规则第3.2节(在C++ 03和C++ 11中)都说:
3 ...应在每个使用它的翻译单元中定义内联函数.
5 [n] ...内联函数可以有多个定义与外部联系(7.1.2)......给定这样一个名为D的实体在多个翻译单元中定义... D的每个定义应由相同的令牌序列组成
这意味着内联函数也可能具有内部链接,因为通过外部链接(即跨翻译单元)以任何方式使用函数将调用未定义的行为(通过第3段),并且内容为所有翻译单元中的内联功能需要相同.
此规则是否存在向后兼容性或特定工具链的原因?
我有一个头文件,将包含大量(30+)内联函数.
我没有让读者滚动或搜索内联函数的定义(实现),而是希望有一个前向声明部分,它声明函数声明以及描述函数的注释.本节将允许读者了解如何使用函数或查找函数,而无需向下滚动到实现.
此外,我希望读者养成使用函数的习惯,而不必看到他们的实现.
独立函数的前向声明的语法是什么?
{这适用于C99和C++}
仅供参考,我使用IAR Workbench C编译器设置使用C99.
inline ×10
c++ ×4
java ×2
.net ×1
c ×1
c++03 ×1
c++11 ×1
c99 ×1
class ×1
cocoa ×1
constants ×1
css ×1
definition ×1
f# ×1
function ×1
javascript ×1
line ×1
linkage ×1
list ×1
objective-c ×1
optimization ×1
performance ×1
static ×1
struct ×1
v8 ×1