为啥我不能在我的类中内联函数? [复制]

Posted

技术标签:

【中文标题】为啥我不能在我的类中内联函数? [复制]【英文标题】:Why can I not inline a function in my class? [duplicate]为什么我不能在我的类中内联函数? [复制] 【发布时间】:2014-09-29 17:28:35 【问题描述】:

我正在通过编写公共数据结构来学习 c++,但我收到了一个编译器警告,提示我的内联 add 方法没有定义。

src/vector.h:10:14: warning: inline function 'Vector::add' is not defined
      [-Wundefined-inline]
        inline void add(const float val);

我做错了什么?据我所知,方法匹配。但是,如果我删除内联方法,它可以正常工作,但第一次调用 add 需要 11380us,但第二次和第三次大约是 3667us - 几乎是 4 倍的惩罚成本。

src/vector.h

//#include <cstddef>

class Vector 
public:
    explicit Vector(const int n);
    explicit Vector(const int n, const float val);
    float& operator[](const int i);
    inline int const length();
    inline void fill(const float val);
    inline void add(const float val);
    inline float sum();
private:
    float* arr;
    int len;
;

src.vector.cpp

#include "vector.h"
#include <iostream>
#include <algorithm>
#include "yepCore.h"
#include "yepMath.h"
#include "yepLibrary.h"
#include <cstdlib>

using namespace std;

inline void Vector::add(const float val)

    chrono::steady_clock::time_point start = chrono::steady_clock::now();   
    for (int i = 0; i < len; ++i) 
        arr[i] += val;
    
    chrono::steady_clock::time_point end = chrono::steady_clock::now();
    cout << "yepp add took " << chrono::duration_cast<chrono::microseconds>(end - start).count()
              << "us.\n";


/**
template <>
void Vector<float>::add(const float val)

    chrono::steady_clock::time_point start = chrono::steady_clock::now();   
    yepCore_Add_V32fS32f_V32f(arr, val, arr, len);
    chrono::steady_clock::time_point end = chrono::steady_clock::now();
    cout << "yepp add took " << chrono::duration_cast<chrono::microseconds>(end - start).count()
              << "us.\n";


...

【问题讨论】:

我应该指出它是模板化的,但为了简化和调试而将其删除,因为我认为这是因为模板化,但问题仍然存在。 见这里 - ***.com/questions/5057021/… 这不是重复的,因为我在标题中添加了一个定义。请在标记重复之前阅读我的问题。 这是一个声明,而不是一个定义。我没有重复这一点,但这是相当成熟的基础。见***.com/questions/1410563/… 【参考方案1】:

内联函数必须在标题中定义。如果它们没有在头文件中定义,那么函数就不能被内联,因为调用者将没有定义。

【讨论】:

如果只在源文件中使用,可以在源文件中定义。并且不在标头中的函数仍然可以内联。 @NeilKirk 然后你会有一个不同的类的声明和定义。 @NeilKirk 因为您正在定义一个未声明的函数。它仍然可以编译和工作,但只是在语义上它们是不同的。 @Zan 但是我在我的头文件中添加了一个内联的 add 方法?

以上是关于为啥我不能在我的类中内联函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

预处理conststaticsizeof-说明内联函数使用的场合

为啥我不能在组件道具中使用内联函数?可以举个例子详细解释一下吗?失去所有状态是啥意思?

为啥我不能内联调用 res.json?

为啥我不能内联创建新的 Java 数组? [复制]

为啥我不能内联创建新的 Java 数组? [复制]

为啥内联函数的效率低于内置函数?