我知道inline是对编译器的提示或请求,用于避免函数调用开销.
那么在什么基础上可以确定函数是否是内联的候选者?在哪种情况下应该避免内联?
在Java中,当一个类重写.toString()
并且你这样做System.out.println()
时会使用它.
class MyObj {
public String toString() { return "Hi"; }
}
...
x = new MyObj();
System.out.println(x); // prints Hi
Run Code Online (Sandbox Code Playgroud)
如何在C++中实现这一点,以便:
Object x = new Object();
std::cout << *x << endl;
Run Code Online (Sandbox Code Playgroud)
会输出一些我选择的有意义的字符串表示Object
吗?
我知道我的类方法有三种不同类型的实现"位置":
1)在我的类(.h文件)中定义方法并在我的.cpp文件中实现它
//.h
class Foo
{
int getVal() const;
};
//.cpp
int Foo::getVal() const
{ return 0; }
Run Code Online (Sandbox Code Playgroud)
2)在我的类(.h文件)中定义并实现该方法.
//.h
class Foo
{
int getVal() const
{ return 0; }
};
Run Code Online (Sandbox Code Playgroud)
3)在我的类中定义方法并在类外但在我的头文件中实现它.
//.h
class Foo
{
int getVal() const;
};
int Foo::getVal() const
{ return 0; }
Run Code Online (Sandbox Code Playgroud)
这三种方法有哪些主要区别?
我对标准中的这一点不太确定.说我有三个这样的文件:
foo.h中
#include <iostream>
inline void foo();
void foo()
{
std::cout << "Foo" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
Foo.cpp中:
#include "foo.h"
void baz();
int main()
{
baz();
foo();
}
Run Code Online (Sandbox Code Playgroud)
bar.cpp
#include "foo.h"
void baz()
{
foo();
}
Run Code Online (Sandbox Code Playgroud)
现在,foo的定义将被编译为编译单元foo.o和bar.o. 如果我理解正确,内联函数将避免链接器冲突.G ++编译和链接这很好,但使用clang ++ 2.8我得到这个错误:
/tmp/cc-7RdmYP.o: In function `foo()':
bar.cpp:(.text+0x50): multiple definition of `foo()'
/tmp/cc-LW3id3.o:foo.cpp:(.text+0x50): first defined here
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
看来clang ++并不是void foo()
一个内联函数.但是,当我向定义添加内联时,它确实正常工作.
我是否必须在void foo()
此处添加内联以将其视为内联函数,或者这是一个clang ++错误?
我正在阅读ODR,正如规则所说"In the entire program, an object or non-inline function cannot have more than one definition"
,我尝试了以下内容......
file1.cpp
#include <iostream>
using namespace std;
inline int func1(void){ return 5; }
inline int func2(void){ return 6; }
inline int func3(void){ return 7; }
int sum(void);
int main(int argc, char *argv[])
{
cout << func1() << endl;
cout << func2() << endl;
cout << func3() << endl;
cout << sum() << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
file2.cpp
inline int func1(void) { return 5; } …
Run Code Online (Sandbox Code Playgroud) 我正在制作一个库,该库将从内联其函数中受益匪浅,但它相当大,我决定将其编译为静态库,而不仅仅是预编译头。在使用该库的代码中,如何使 GCC 从静态库内联代码(粘贴调用代码而不是链接和调用它)(这是否可能)?
Hii,
我是C++的新手.我确实阅读过有关内联函数的内容并正确理解它们.但是这个站点说"如果我们在一个.cpp文件中写入内联函数的定义并从另一个文件调用它,我们得到一个'未解决的外部'错误....为什么会这样......?这可以做到正常功能正确...如果我错了请纠正我...
谢谢
我有一个简单的类来存储传感器数据,可以概括为
class Data
{
public:
Data(){timestamp = Time::now(); id = sNextID++; data = 0; type = DATA_TYPE_UNKNOWN;}
double data;
Time timestamp;
DataType type;
private:
static unsigned int sNextID;
};
Run Code Online (Sandbox Code Playgroud)
我有一个头文件,声明了一堆类似的数据类.鉴于类的简单性,不需要实现cpp文件.
问题是,如果没有实现文件,我该如何初始化sNextID?我在某个地方看到它默认为0这样会好的,虽然依赖它似乎有点hackish.但更重要的是,如果没有在某个地方初始化它,链接器就会抱怨未定义的引用.
我已经定义了以下函数chess_location.h
:
inline chess_location operator+(chess_location lhs, const chess_coord& rhs);
Run Code Online (Sandbox Code Playgroud)
然后,在chess_location.cpp
:
#include "chess_location.h"
chess_location operator+(chess_location lhs, const chess_coord& rhs) {
//function definition
}
Run Code Online (Sandbox Code Playgroud)
然后在我的main()
in中使用此运算符main.cpp
,如下所示:
#include "chess_location.h"
int main() {
chess_location_B = chess_location_A + chess_coord;
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到链接器错误,说无法找到运算符:
error LNK2019: unresolved external symbol "class chess_location __cdecl operator+(class chess_location,class chess_coord const &)" (??H@YA?AVchess_location@@V0@ABVchess_coord@@@Z) referenced in function _main
Run Code Online (Sandbox Code Playgroud)
在我看来,链接器并没有将运算符的声明连接到定义,但我不确定为什么.我怀疑我的身体可能有问题const
.main.cpp
但是,如果我将运算符定义移动到,则所有内容都会编译并正常工作.
知道这个错误来自何处?
通常我更喜欢完全拆分声明和定义,因此,我倾向于定义内联方法,.cpp
我只是希望链接优化器在不同的编译单元中使用它时将其内联。
我的问题是:
我正在通过编写公共数据结构来学习c ++,并且我有一个编译器警告我没有定义我的内联添加方法.
src/vector.h:10:14: warning: inline function 'Vector::add' is not defined
[-Wundefined-inline]
inline void add(const float val);
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?据我所知,方法匹配.但是,如果我删除内联方法,它工作正常,但第一次调用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;
};
Run Code Online (Sandbox Code Playgroud)
src.vector.cpp
#include "vector.h"
#include <iostream>
#include <algorithm>
#include "yepCore.h"
#include "yepMath.h"
#include "yepLibrary.h"
#include <cstdlib>
using …
Run Code Online (Sandbox Code Playgroud) 我经常使用C++并且遇到一个让我失望的简单错误.
在Xcode中,我有以下两个错误:在Event.h中:Control reaches end of non-void function
在Event.cpp中:Overloaded operator must have at least one argument of class or enumeration
这两个错误都在方法签名的行上
bool operator () (Event *left, Event *right)
Run Code Online (Sandbox Code Playgroud)
这里是完整的.h和.cpp文件(还没有那么多):Event.h
#ifndef __EventSimulation__EventComparison__
#define __EventSimulation__EventComparison__
#include <iostream>
#include "Event.h"
class EventComparison {
public:
bool operator () (Event *left, Event *right){}
};
#endif
Run Code Online (Sandbox Code Playgroud)
Event.cpp
#include "EventComparison.h"
#include "Event.h"
bool operator() (Event *left, Event *right) {
return left->time > right->time;
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮我修复这个错误并解释什么/为什么发出编译错误以及如何在功能中避免这种情况.谢谢你的帮助!
c++ ×12
inline ×3
c++11 ×2
gcc ×2
linker ×2
c ×1
clang ×1
compilation ×1
header-files ×1
tostring ×1