언어를 배우는 사람이라면 걱정할 필요가 없습니다. 그렇지 않으면 입증 될 때까지 충분히 빨리 고려하십시오. 즉, 오해의 소지가 있거나 불완전한 대답이 많으므로 기록을 위해 약간의 미묘한 함의를 살필 것입니다. 클래스를 고려
class Booth
{
public:
int get_tickets_sold();
void set_tickets_sold();
private:
int tickets_sold;
};
은 얻을 설정 기능 (A 정의라고도 함) 구현은 아직
를 지정되지 않았습니다. 클래스 선언 안에 함수 본문을 지정한 경우 컴파일러는 암시 적으로 해당 함수가 본문에 삽입되도록 요청한 것으로 간주합니다 (지나치게 큰 경우에는 무시할 수 있음). 나중에
inline
키워드를 사용하여 지정하면 정확하게 안전한 결과를 얻습니다. 약식 ...
class Booth
{
public:
int get_tickets_sold() { return tickets_sold; }
...
... 그리고 ...
class Booth
{
public:
int get_tickets_sold();
...
};
inline int Booth::get_tickets_sold() { return tickets_sold; }
... 적어도 표준이 기대하는 우리를 격려 어떤 측면에서 (동일하지만, 각 컴파일러 휴리스틱는 다를 수 있습니다 - 인라이닝은 컴파일러가 무시할 수있는 요청입니다.
inline
키워드없이 나중에 함수 본문을 지정하면 컴파일러는 해당 함수 본문을 인라인 할 의무가 없지만 여전히 선택할 수 있습니다.동일한 번역 단위 (즉, 컴파일중인 .cc/.cpp/.C++/etc. "구현"파일 또는 직접 또는 간접적으로 포함 된 일부 헤더)에 표시 될 가능성이 훨씬 큽니다. 구현이 링크 시간에만 사용 가능한 경우 함수는 모두에 인라인되지 않을 수 있지만 특정 컴파일러와 링커가 상호 작용하고 협조하는 방식에 따라 다릅니다. 이 아닌은 단순히 최적화를 실현하고 마법을 기대할 수있는 문제입니다.
// inline.h:
void f();
// inline.cc:
#include <cstdio>
void f() { printf("f()\n"); }
// inline_app.cc:
#include "inline.h"
int main() { f(); }
이 건물 :
g++ -O4 -c inline.cc
g++ -O4 -o inline_app inline_app.cc inline.o
를 인라인 조사 : 실행이에 0x08048416에) (주에서 0x080483f3에서 갔다
$ gdb inline_app
...
(gdb) break main
Breakpoint 1 at 0x80483f3
(gdb) break f
Breakpoint 2 at 0x8048416
(gdb) run
Starting program: /home/delroton/dev/inline_app
Breakpoint 1, 0x080483f3 in main()
(gdb) next
Single stepping until exit from function main,
which has no line number information.
Breakpoint 2, 0x08048416 in f()
(gdb) step
Single stepping until exit from function _Z1fv,
which has no line number information.
f()
0x080483fb in main()
(gdb)
공지 사항을 이것을 증명하려면 다음 코드를 고려 f()를 누른 다음 main()의 0x080483fb로 돌아가십시오 ... 명확하게 이 아닌 인라인됩니다. 이것은 함수의 구현이 간단하기 때문에 인라이닝을 기대할 수 없다는 것을 보여줍니다.
이 예제는 개체 파일의 정적 링크와 관련이 있습니다. 분명히 라이브러리 파일을 사용하는 경우 은 실제로 함수를 인라이닝하지 않으므로 클라이언트 코드를 다시 컴파일하지 않고도 라이브러리를 업데이트 할 수 있습니다. 링크가 어쨌든 로딩 타임에 암묵적으로 수행되는 공유 라이브러리의 경우 더욱 유용합니다.
자주 사용되는 클래스는 성능에 중요한 루프 내에서 호출 될 것으로 예상되는 경우 예상되는 인라인 함수 정의 (예 : 내부 클래스 또는 inline
키워드)의 두 가지 형식을 사용하지만 반대 고려 사항 함수를 인라이닝 (inlining)하여 함수에 대한 변경 사항을 가져 오기 위해 클라이언트 코드를 재 컴파일 (상대적으로 느리거나 자동화 된 트리거가 없을 수도 있음)하고 relinked (빠른 실행, 다음 실행시 빠른 실행) 이행.
이런 종류의 고려 사항은 성가시다. 그러나 이러한 절충안을 계획적으로 관리하면 수십 억 가지 라인과 수천 개의 개별 프로젝트로 확장하여 수십 년 동안 다양한 라이브러리를 공유 할 수 있습니다.
다른 작은 세부 사항 : 야구장 그림과 같이 라인 밖 가져 오기/설정 기능은 일반적으로 인라인 코드보다 약 10 배 느립니다. CPU, 컴파일러, 최적화 수준, 변수 유형, 캐시 히트/미스 등으로 분명히 달라질 것입니다.
성능에 대해 걱정하시는 이유는 무엇입니까? – GManNickG
왜냐하면 내가 임무를 수행해야하고 가장 빠른 실행 코드가 보너스 포인트를 얻을 수도 있기 때문입니다. –
좋은 디자인 대신 성과가 중요하다고 생각하게 만들기 위해 선생님 께 수치스러워합니다. – GManNickG