我知道内联函数要么被调用,要么被称为普通函数.
但是,我如何知道内联函数是否实际被替换在它被调用的地方,因为将内联函数作为内联处理的决定是在编译时?
我正在尝试简化以下代码.
代码应执行的基本步骤如下:
一个简单的例子是:
    String temp = System.getProperty("XYZ");
    String result = "default";
    if(temp != null && !temp.isEmpty()){
        result = temp;
    }
我使用三元运算符进行了另一次尝试:
    String temp;
    String result = isNotNullOrEmpty(temp = System.getProperty("XYZ")) ? temp : "default";
isNotNullOrEmpty()方法
 private static boolean isNotNullOrEmpty(String str){
    return (str != null && !str.isEmpty());
}
是否可以在线完成所有这些操作?我知道我可以这样做:
String result = isNotNullOrEmpty(System.getProperty("XYZ")) ? System.getProperty("XYZ") : "default";
但我两次调用相同的方法.我会喜欢做这样的事情(这不起作用):
String result = isNotNullOrEmpty(String temp = System.getProperty("XYZ")) ? temp : "default";
我想在同一行中初始化'temp'字符串.这可能吗?或者我该怎么办?
谢谢你的建议.
蒂姆
我不小心发现Clang编译器允许:
inline class AAA
{
};
在C++中.这是什么?
PS.我向Clang邮件列表报告了这个cfe-dev@cs.uiuc.edu,现在正在等待回复.我知道了,我会更新这个问题.
根据C++规范,以下两个类是否等效定义?
class A
{
   void f()
   {
   }
};
class B
{
   inline void f()
   {
   }
};
即,将"内联"限定符放在类定义中定义的成员函数上是完全冗余的吗?
跟随问题:假设它是多余的,对于代码样式,保留"内联"标记是否明智,以便未来的开发人员意识到该函数应该内联,并且不会删除其他地方的定义并删除内联?
谢谢 :)
我在stackoverflow中读了几个关于inlineC的问题,但仍然不清楚.
static inline void f(void) {}没有实际的区别static void f(void) {}.inline void f(void) {}在C中不能像C++那样工作.它在C中如何工作?extern inline void f(void);什么?我从来没有真正inline在我的C程序中找到关键字的使用,当我在其他人的代码中看到这个关键字时,它几乎总是static inline,我认为没有区别static.
在此链接中,什么是内联函数以及什么是内联关键字.我正在阅读它,因为我意识到我从未理解这两个概念的含义以及它们应该如何在实践中使用.我在引用和评论我提供的链接
内联函数或内联变量(自C++ 17开始)是具有以下属性的函数或变量(自C++ 17起):
1)只要每个定义出现在不同的翻译单元中,程序中的内联函数或变量(自C++ 17)可能有多个定义.例如,内联函数或内联变量(自C++ 17)可以在包含在多个源文件中的头文件中定义.
在这里我已经有了解问题,声明是新标识符的规范
void func(void);
而定义是实际的实现,包括正文
void func(void) {
  //some code...
}
第1点意味着我可以提供不同的实现,只要它们处于不同的翻译单元(即每个源文件的每个头文件一个实现),但我很困惑,因为我有一个source.cc带有声明的源文件func并且一个带有func翻译单元的另一个声明的头文件就是这对,source.cc+header.h并且在这种情况下声明了两次func没有任何意义,是吗?
2)内联函数或变量的定义(因为C++ 17)必须存在于访问它的转换单元中(不一定在访问点之前).
这是通常的情况,我将定义与声明分开,第一个在头文件中,第二个在源文件中,如果我需要使用函数我必须只包含头?接入点将在链接阶段由源提供,是否正确?
3)具有外部链接(例如,未声明为静态)的内联函数或变量(因为C++ 17)具有以下附加属性:1)必须在每个翻译单元中内联声明.2)每个翻译单元都有相同的地址.
你能提供一个简单的例子吗?我无法想象这种情况的实际案例.情况3)声明关键字inline是强制性的,除非要声明的函数是静态的.
我到目前为止所说的一切是否正确?
实际上,当这样的函数非常小时,函数应该是内联的,但并不总是编译器会内联声明为内联的函数,例如,如果它有内部循环或递归(有效C++状态如此).一般来说它依赖于编译器,我现在很奇怪......
假设我有两个函数,第一个是自包含的(它不会在内部调用任何其他函数),第二个调用是第一个(为了参数,你可以假设它们都是10行).它们都应该内联声明吗?它们应该在头文件中声明吗?或者我应该在头文件中分离定义和源文件中的实现?什么会更好?
编辑1:
如果我通过示例工作,并通过相关的汇编代码分析,其中一个答案会更好.
我删除了以前的代码,因为它没有意义(-O3没有设置标志优化).
我重新开始...我有5个文件header.h,src.cc,src1.cc,src2.cc和main.cc.对于每个翻译单元,发布相关的汇编代码.
我以三种不同的方式操作这些文件,然后观察生成的汇编代码,这有助于我理解内联关键字的工作原理.
例1:
header.h
#ifndef HEADER_H_
#define HEADER_H_
int func(int a, int b);
int test_1();
int test_2();
#endif /* HEADER_H_ */
src.cc
#include …来自VB,JavaScript不是很容易掌握.请不要消极,我已经尝试并搜索了负载,但没有运气.顺便说一下,我正在创建一个从SelectJS中的选项列表初始化的下拉控件.
虚拟代码:
var col = 'tardis'; 
var x = '<option value="' + col + '">Very roomy</option>');
selected如果col等于'螺丝刀',我想在col ONLY之后添加.
我试过用IF语句?并且:但似乎无法理解它.将''作为假值不起作用.没有选择任何项目,列表为空白.删除IF语句和所有工作.
任何想法,再次,抱歉新的.
F#中的集合初始化程序语法是什么?在C#中,您可以编写如下内容:
new Dictionary<string, int>() {
    {"One", 1},
    {"two", 2}}
我如何在F#中做同样的事情?我想我可以使用自己的语法,但似乎应该有一个内置或标准的语法.
我在Stack Overflow中搜索了类似函数的宏与内联函数的优缺点.
我发现了以下讨论: C中不同宏函数/内联方法的优缺点
......但它没有回答我的主要问题.
也就是说,在内存使用和执行速度方面,使用宏函数(带有变量,可能还有其他函数调用)和内联函数的开销是多少?
开销中是否存在编译器相关的差异?我同时拥有icc和gcc.
我模块化的代码片段是:
double AttractiveTerm = pow(SigmaSquared/RadialDistanceSquared,3);
double RepulsiveTerm = AttractiveTerm * AttractiveTerm;
EnergyContribution += 
   4 * Epsilon * (RepulsiveTerm - AttractiveTerm);
我将其转换为内联函数/宏的原因是我可以将其放入ac文件中,然后有条件地编译其他类似但略有不同的函数/宏.
例如:
double AttractiveTerm = pow(SigmaSquared/RadialDistanceSquared,3);
double RepulsiveTerm = pow(SigmaSquared/RadialDistanceSquared,9);
EnergyContribution += 
   4 * Epsilon * (RepulsiveTerm - AttractiveTerm);
(注意第二行的差异......)
这个函数是我的代码的核心功能,在我的程序中每步调用数千次,我的程序执行数百万步.因此,我希望尽可能减少开销,因此我浪费时间来担心内联的转换,将代码转换为宏.
根据之前的讨论,我已经意识到宏的其他优点/缺点(类型独立性和由此产生的错误)...但我最想知道的,目前不知道的是性能.
我知道你们中的一些C老兵会对我有一些很好的见解!
constexpr说明noexcept符是否意味着函数的说明符?对类似问题的回答对说明者说"是" inline,但Eric Niebler的文章让我想知道对当前问题的可能答案.在我看来,答案取决于使用constexpr函数的上下文:是常量表达式上下文还是运行时上下文,即在编译时是否已知函数的所有参数.
我希望答案是"是",但简单的检查表明情况并非如此.
constexpr
bool f(int) noexcept
{
    return true;
}
constexpr
bool g(int)
{
    return true;
}
static_assert(noexcept(f(1)));
static_assert(noexcept(g(2))); // comment this line to check runtime behaviour
#include <cassert>
#include <cstdlib>
int
main(int argc, char * [])
{
    assert(noexcept(f(argc)));
    assert(noexcept(g(argc)));
    return EXIT_SUCCESS;
}