簡體   English   中英

在類定義中定義的成員函數是否與在C ++中其他地方定義的成員函數的編譯方式不同?

[英]Are member functions defined in a class definition compiled differently than member functions defined elsewhere in C++?

在類定義中定義的成員函數是否與在C ++中其他地方定義的成員函數的編譯方式不同? 例如,考慮以下foo.h

#pragma once
struct foo {
    void bar() {}
    void buz();
};

和foo.cpp

#include "foo.h"
void foo::buz() {};

如果我們看一下foo.o的符號

$ g++ -c foo.cpp

$ nm -a foo.o
0000000000000000 b .bss
0000000000000000 n .comment
0000000000000000 d .data
0000000000000000 r .eh_frame
0000000000000000 a foo.cpp
0000000000000000 n .note.GNU-stack
0000000000000000 t .text
0000000000000000 T _ZN3foo3buzEv

$ c++filt _ZN3foo3buzEv
foo::buz()

我們看到我們只有foo::buz的符號。 現在,假設我們編譯了多個包含foo.h文件,然后從結果中創建一個庫。 成員函數barbuz是否區別對待?

是,有一點不同。 如果在類定義中定義了成員函數,則編譯器會嘗試使其成為內聯函數。 對於您的示例,該函數非常簡單,可以使其內聯。 所以編譯baz bar內聯,你只看到baz符號。

它的好壞在很大程度上取決於具體的功能和用例。 內聯函數不需要實際的函數調用,那里有性能改進。 但缺點是如果在許多地方包含類標題,那么將增加二進制文件大小。

另請注意,inline是對編譯器的請求。 編譯器可以自由地忽略請求並將其視為常規方法。

9.2.1 / 1開始

可以在其類定義中定義成員函數,在這種情況下,它是內聯成員函數

另一方面,從9.2.1 / 2

內聯成員函數(無論是靜態的還是非靜態的)也可以在其類定義之外定義,前提是它在類定義中的聲明或在類定義之外的定義將函數聲明為內聯orconstexpr。

問題是: 類定義中定義的成員函數是否與C ++中其他地方定義的成員函數進行了不同的編譯?

它主要取決於您如何定義它們,因為您可以從上面的引文中推斷出來。
在您的示例中,它們實際上是不同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM