classes/structs 中的内联语句
Inline statement in classes/structs
最近,我在头文件中发现了 inline
语句的两种用法:
(1)
class A {
public:
inline A() {
// ...
}
};
(2)
class A {
public:
inline A();
};
inline A::A() {
// ...
}
例如(1)听说inline
的风格不错。关于 (2) 我不确定如果使用 inline
是否会改变任何东西。
那么,在任何一种情况下使用 inline
都是好的风格吗?它会影响编译吗?
在第一种情况下,不需要 inline
,因为代码已经被内联,同时作为 class 成员被定义和声明。
inline
我的意思是每个翻译单元都会有自己的方法版本,不会干扰链接。
在没有 inline
的第二个示例中,您将收到链接器错误,因为翻译单元不遵守 one definition rule:该方法在 class 内部声明但在外部定义,这对编译器来说还不够,您必须明确指定每个翻译单元都将获得自己的方法副本(无论如何都会在以后进行优化)。
请注意,这些注意事项不适用于内联含义,即省略直接用其主体替换其在调用站点的调用的方法,这是优化编译器会处理它,你不应该费心去暗示它。
最近,我在头文件中发现了 inline
语句的两种用法:
(1)
class A {
public:
inline A() {
// ...
}
};
(2)
class A {
public:
inline A();
};
inline A::A() {
// ...
}
例如(1)听说inline
的风格不错。关于 (2) 我不确定如果使用 inline
是否会改变任何东西。
那么,在任何一种情况下使用 inline
都是好的风格吗?它会影响编译吗?
在第一种情况下,不需要 inline
,因为代码已经被内联,同时作为 class 成员被定义和声明。
inline
我的意思是每个翻译单元都会有自己的方法版本,不会干扰链接。
在没有 inline
的第二个示例中,您将收到链接器错误,因为翻译单元不遵守 one definition rule:该方法在 class 内部声明但在外部定义,这对编译器来说还不够,您必须明确指定每个翻译单元都将获得自己的方法副本(无论如何都会在以后进行优化)。
请注意,这些注意事项不适用于内联含义,即省略直接用其主体替换其在调用站点的调用的方法,这是优化编译器会处理它,你不应该费心去暗示它。