C ++ inline benar-benar berbeda dengan C inline .
#include <iostream>
extern inline int i[];
int i [5];
struct c {
int function (){return 1;} //implicitly inline
static inline int j = 3; //explicitly inline
};
int main() {
c j;
std::cout << i;
}
inline
sendiri mempengaruhi compiler, assembler dan linker. Ini adalah arahan ke kompiler yang mengatakan hanya memancarkan simbol untuk fungsi / data ini jika digunakan dalam unit terjemahan, dan jika ya, maka seperti metode kelas, beri tahu assembler untuk menyimpannya di bagian .section .text.c::function(),"axG",@progbits,c::function(),comdat
atau .section .bss.i,"awG",@nobits,i,comdat
untuk data. Instansiasi template juga masuk dalam grup comdat mereka sendiri.
Berikut ini .section name, "flags"MG, @type, entsize, GroupName[, linkage]
. Misalnya, nama bagiannya adalah .text.c::function()
. axG
berarti bagian tersebut dapat dialokasikan, dapat dieksekusi, dan dalam sebuah grup yaitu nama grup akan ditentukan (dan tidak ada bendera M sehingga tidak ada entsize yang akan ditentukan); @progbits
berarti bagian tersebut berisi data dan tidak kosong; c::function()
adalah nama grup dan grup tersebutcomdat
keterkaitan artinya dalam semua file objek, semua bagian yang ditemukan dengan nama grup ini yang ditandai dengan comdat akan dihapus dari executable final kecuali untuk 1 yaitu kompiler memastikan bahwa hanya ada satu definisi dalam unit terjemahan dan kemudian memberitahu assembler untuk menempatkan itu dalam grup sendiri di file objek (1 bagian dalam 1 grup) dan kemudian linker akan memastikan bahwa jika ada file objek memiliki grup dengan nama yang sama, maka hanya memasukkan satu di final .exe. Perbedaan antarainline
dan tidak menggunakan inline
sekarang terlihat oleh assembler dan akibatnya linker, karena itu tidak disimpan dalam .data
atau biasa.text
dll oleh assembler karena arahan mereka.
static inline
dalam sebuah kelas berarti ini merupakan definisi tipe dan bukan deklarasi (memungkinkan anggota statis untuk didefinisikan dalam kelas) dan membuatnya inline; sekarang berperilaku seperti di atas.
static inline
pada lingkup file hanya memengaruhi kompiler. Ini berarti ke kompiler: hanya memancarkan simbol untuk fungsi / data ini jika digunakan dalam unit terjemahan dan melakukannya sebagai simbol statis biasa (menyimpan in.text /.data tanpa direktif .globl). Untuk assembler sekarang tidak ada perbedaan antara static
danstatic inline
extern inline
adalah deklarasi yang berarti Anda harus mendefinisikan simbol ini di unit terjemahan atau melempar kesalahan kompiler; jika sudah didefinisikan maka perlakukan sebagai reguler inline
dan untuk assembler dan linker tidak akan ada perbedaan antara extern inline
dan inline
, jadi ini hanya penjaga kompiler.
extern inline int i[];
extern int i[]; //allowed repetition of declaration with incomplete type, inherits inline property
extern int i[5]; //declaration now has complete type
extern int i[5]; //allowed redeclaration if it is the same complete type or has not yet been completed
extern int i[6]; //error, redeclaration with different complete type
int i[5]; //definition, must have complete type and same complete type as the declaration if there is a declaration with a complete type
Keseluruhan di atas tanpa garis kesalahan runtuh menjadi inline int i[5]
. Jelas jika Anda melakukan extern inline int i[] = {5};
ituextern
akan diabaikan karena definisi eksplisit melalui penugasan.
inline
di namespace, lihat ini dan ini