在最近的同行评审期间,另一位软件工程师建议我声明该inline函数inline在定义中(在类之外)以及声明中(在类的内部).他的论点是" 通过内联标记,你说这个方法的执行速度比非内联方法快得多,并且调用者不必担心对方法的过度调用. "
真的吗?如果我是一个类的用户,我真的关心对该方法的过度调用吗?在定义和声明中将其列为内联是否有任何问题?在C++ FAQ指出:
最佳实践:仅限于类体外的定义.
那么谁在这里?
我有一个有内联成员的类,但后来我决定从头中删除实现,所以我将函数的成员体移到cpp文件中.起初我刚刚在头文件中留下了内联签名(草率我),程序无法正确链接.然后我修好了标题,当然一切正常.
但是不是内联完全可选吗?
在代码中:
第一:
//Class.h
class MyClass
{
   void inline foo()
   {}
};
接下来改为(不会链接):
//Class.h
class MyClass
{
   void inline foo();
};
//Class.cpp
void MyClass::foo()
{}
然后(将工作正常):
//Class.h
class MyClass
{
   void foo();
};
//Class.cpp
void MyClass::foo()
{}
我认为内联是可选的,想象我可能会因为我的邋iness警告,但没想到链接错误.在这种情况下编译器应该做的正确/标准的事情是什么,我是否应该根据标准得到我的错误?
哪个更快?
SELECT UserName
FROM dbo.UserTable
WHERE UserID in (1,3,4)
SELECT UserName
FROM dbo.UserTable
WHERE UserID = 1 
      OR UserID = 3
      OR UserID = 4
我知道该关键字inline具有有用的属性,例如用于在头文件中保留模板特化.另一方面,我经常读到这inline几乎没有用作编译器实际内联函数的提示.此外,关键字不能在cpp文件中使用,因为编译器想要inline在调用时检查用关键字标记的函数.
因此,我对现代编译器的"自动"内联功能(即gcc 4.43)感到有些困惑.当我在cpp中定义一个函数时,编译器是否可以内联它,如果它认为内联对函数有意义,或者我是否剥夺了他的某些优化功能?(这对于大多数功能来说都没问题,但对于经常调用的小功能很重要)
我有一些在.h文件中定义的小函数.这是一个小项目(现在),我想避免将声明和定义分开的痛苦,因为它们一直在变化.为了避免多重定义的符号,我可以拥有它们static或inline.什么应该是首选,为什么?
我知道在头文件中定义函数通常是不好的做法.您不必在答案中提及,这个问题在技术上意味着.
我已经了解了通常最好不要在头文件中定义任何内容,因为冗余副本是针对包含头文件的每个其他文件进行的.但是,在静态内联方法的情况下,似乎我必须在现场定义它(至少Visual Studio 2010不允许我这样做).因此,如果我在头文件中编写接口,我就无法定义类定义的静态内联方法或.cpp文件.
那么,我是否应该费心去使用静态内联方法呢?还有一个相关的问题:我是否应该在头文件中定义任何方法或变量(常量怎么样)?
无论如何,奇怪的是,这不是我的C++书籍中非常详细的内容.
编辑:我读过有关静态内联方法的类似问题,但似乎没有一个直接解决这个问题.
从C ++ 17开始,可以使用inline关键字在标头中初始化全局变量和静态成员。虽然我了解了为什么需要保护函数中的静态变量(因为即使在多线程上下文中初始化也只应发生一次),但我不明白为什么也要保护这些新的内联变量(您可以在此处查看:https:// godbolt.org/z/YF8PeQ)。我认为无论如何,所有全局变量和静态成员的初始化都在程序执行的开始(甚至在之前main())进行,因此此时无需考虑多个线程。你能解释一下吗?
F#是否与C#有相同的问题,你不能直接使用泛型T类型的算术运算符?
你能写一个通用的Sum函数来返回支持算术加法的任何值的总和吗?
标题总结了我的问题.一个证明这一点的例子很好.
inline ×10
c++ ×6
header-files ×2
static ×2
anonymous ×1
c ×1
c++17 ×1
f# ×1
function ×1
generics ×1
javascript ×1
math ×1
performance ×1
sql-server ×1