有使用的两层含义inline
的关键字(§7.1.3 / 4):
- 它暗示编译器,在呼叫的点功能体的取代是在通常的函数调用机制优选的。
- 即使省略内联替代,其他规则(尤其是写入一个定义规则 )为内联则紧随其后。
通常,如果需要的话,那么标记功能的任何主流的编译器会在调用点替代函数体inline
仅仅为#1
是不是真的需要。
此外WRT #2
,正如我在声明功能了解static inline
函数,
在static
的功能关键字强制inline
函数有一个内部连接( 内联函数具有外部连接 )这样的功能中的每一个实例被视为一个单独的功能( 各功能的地址是不同的 )和这些功能中的每一种情况下具有它们的静态局部变量和字符串文字的自身拷贝( 内联函数只有一个,这些副本 )
因此,这样的功能的作用就像任何其他static
函数和所述关键字inline
不具有重要性了,它变得多余。
所以,实际上标志着一个功能, static
和inline
都没有用的。 要么应该是static
( 不最优选 )或inline
( 最优选的 ),
那么,使用static
和inline
一起上几乎无用的功能?
你的分析是正确的,但并不一定意味着无用。 即使大多数编译器做自动内联函数(原因#1),这是最好声明inline
只是为了描述意图。
忽略与互动inline
, static
功能应谨慎使用。 在static
的命名空间范围修改有利于未命名空间(C ++ 03§D.2)的前身是过时了。 对于一些模糊的原因,我不记得这是从折旧除去C ++ 11,但你应该很少需要它。
所以,实际上标志着一个功能的静态和内联都没有用的。 要么应该是静态的(不最优选)或内联(最优选的),
有没有偏爱的概念。 static
意味着具有相同签名的不同功能可以在不同的存在.cpp
文件(翻译单元)。 inline
没有static
意味着它是确定了不同的翻译单位来定义具有相同的定义相同的功能。
什么是首选的方法是使用不具名命名空间,而不是static
:
namespace {
inline void better(); // give the function a unique name
}
static inline void worse(); // kludge the linker to allowing duplicates
静态和内联是正交的(独立的)。 静态意味着函数不应该是翻译单元的外面看到,内联是一个提示编译器的程序员会喜欢这个功能,内联。 这两个不相关。
使用static inline
是有道理的,当内联函数没有翻译单元之外使用。 通过使用它,你可以在另一个tranlation单元具有相同名称的命名另一联函数防止意外违反ODR规则的情况。
例:
source1.cpp:
inline int Foo()
{
return 1;
}
int Bar1()
{
return Foo();
}
source2.cpp:
inline int Foo()
{
return 2;
}
int Bar2()
{
return Foo();
}
如果不使用静态上的Foo(或不使用匿名命名空间,这是由最C ++程序员优选方式),本实施例中违反ODR和结果是不确定的。 您可以使用Visual Studio测试BAR1 / BAR2的结果将取决于编译器设置 - 在调试配置都BAR1和BAR2将返回相同的值(内联不使用,一个实现链接器随机选择),在他们每个人的Release配置将返回预期值。
我可能不完全正确的这一点,但据我所知声明一个函数static inline
是使(或允许)编译器生成在功能真的是在编译的代码没有被定义在所有的机器代码的唯一途径和所有你必须是声明函数的直接代入指令序列,就像它是只是一个普通的过程体,在相对于从源代码的函数定义过程调用的机器代码无痕。
也就是说,只有static inline
真的可以替代使用宏, inline
本身是不够的。
一个简单的谷歌搜索“静态内联”会告诉你,谈论它的编译器文档页面。 我想这应该足以回答你的问题,并说,“不,这不是毫无实际用处的。” 这里是一个网站讨论使用的一个例子inline
,具体的static inline
http://www.greenend.org.uk/rjk/tech/inline.html
如果你谈论的自由函数( namespace
范围),那么你的假设是正确的。 static inline
函数确实没有太多的价值。 因此, static inline
是一个简单的static
功能,可自动满足ODR和inline
是多余的ODR目的。
然而,当我们谈论成员方法( class
范围),在static inline
函数确实有值。
一旦你声明一个class
方法, inline
,它的全身已是所有翻译单元,其中包括可见光class
。
请记住, static
关键字有不同的意义,当谈到对一个class
。
编辑 :正如你可能知道, static
一内部功能class
不具有内在联系,换句话说, 一个类不能有它的不同拷贝static
取决于翻译(的.cpp)单元的方法 。
但免费static
的功能namespace
/全球范围内确实有每每一个翻译单元不同的副本。
如
// file.h
static void foo () {}
struct A {
static void foo () {}
};
// file1.cpp
#include"file.h"
void x1 ()
{
foo(); // different function exclusive to file1.cpp
A::foo(); // same function
}
// file2.cpp
#include"file.h"
void x2 ()
{
foo(); // different function exclusive to file2.cpp
A::foo(); // same function
}
我刚读了一个gcc的手册页,并明确规定了编译器标志使用静态内联。 在标志的情况下,内联函数,如果它也是静态的,在每种情况下,它被称为是内联,那么它摆脱它永远不会被创建的对象文件中使用的函数定义,从而降低由一点所生成的代码的大小。