C++20四大之一:module特性详解
生活随笔
收集整理的這篇文章主要介紹了
C++20四大之一:module特性详解
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前言
C++20最大的特性是什么?
——最大的特性是迄今為止沒有哪一款編譯器完全實(shí)現(xiàn)了所有特性。
C++20標(biāo)準(zhǔn)早已封版,各大編譯器也都已支持了C++20中的多數(shù)特性,但迄今為止(2021.7),尚未有哪一款編譯器完整支持C++20中的所有特性。有人認(rèn)為C++20是C++11以來最大的一次改動(dòng),甚至比C++11還要大。
本文僅介紹C++20四大特性當(dāng)中的module部分。全文分為三章:第一章探究C++編譯連接模型的由來以及利弊、第二章介紹C++20 module機(jī)制的使用姿勢、第三章總結(jié)module背后的機(jī)制、利弊、以及各大編譯器的支持情況。
1,C++是兼容C的:不但兼容了C的語法,也兼容了C的編譯鏈接模型 2,1973年初,C語言基本定型:有了預(yù)處理、支持結(jié)構(gòu)體;編譯模型也基本定型為:預(yù)處理、編譯、匯編、鏈接四個(gè)步驟并沿用至今;1973年,K&R二人使用C語言重寫了Unix內(nèi)核。 3,為何要有預(yù)處理?為何要有頭文件? 4,在C的誕生的年代,用來跑C編譯器的計(jì)算機(jī)PDP-11的硬件配置如下: 內(nèi)存:64 KiB 硬盤:512 KiB 編譯器無法把較大的源碼文件放入狹小的內(nèi)存,故當(dāng)時(shí)的C編譯器設(shè)計(jì)目標(biāo)是能夠支持模塊化編譯(將源碼分成多個(gè)源碼文件,挨個(gè)編譯)、生成多個(gè)目標(biāo)文件,最后整合(鏈接)成一個(gè)可執(zhí)行文件。 C編譯器分別編譯多個(gè)源碼文件的過程,實(shí)際上是一個(gè)One pass compile,即:從頭到尾掃描一遍源碼、邊掃描邊生成目標(biāo)文件、過眼即忘(以源碼文件為單位)、后面的代碼不會(huì)影響編譯器前面的決策,該特性導(dǎo)致了C語言的以下特征: A: 結(jié)構(gòu)體必須先定義再使用:否則無法知道成員的類型以及偏移,無法生成目標(biāo)代碼 B: 局部變量先定義再使用,否則無法知道變量的類型以及在棧中的位置。且為了方便編譯器管理?xiàng)?臻g,局部變量必須定義在語句塊的開始處。 C: 外部變量,只需要知道類型、名字(二者合起來便是聲明)即可使用(生成目標(biāo)代碼),外部變量的實(shí)際地址由連接器填寫 D: 外部函數(shù),只需知道函數(shù)名、返回值、參數(shù)類型列表(函數(shù)聲明)即可生成調(diào)用函數(shù)的目標(biāo)代碼,函數(shù)的實(shí)際地址由連接器填寫。 5 頭文件和預(yù)處理恰好滿足了上述要求:頭文件只需用少量的代碼,聲明好函數(shù)原型、結(jié)構(gòu)體等信息,編譯時(shí)將頭文件展開到實(shí)現(xiàn)文件中,編譯器即可完美執(zhí)行One pass comlile過程了。至此,我們看到的都是頭文件的必要性、益處,頭文件也有很多負(fù)面影響:
1 低效。頭文件的本職工作是提供前置聲明,而提供前置聲明的方式采用了文本拷貝,文本拷貝過程不帶有語法分析,會(huì)一股腦將需要的、不需要的聲明全部拷貝到源文件中。 2 傳遞性。最底層的頭文件中宏、變量等實(shí)體的可見性,可以通過中間頭文件“透傳”給最上層的頭文件,這種透傳會(huì)帶來很多麻煩。 3 降低編譯速度。加入a.h被三個(gè)模塊包含,則a會(huì)被展開3次、編譯三次。 4 順序相關(guān)。程序的行為受頭文件的包含順影響,也受是否包含某一個(gè)頭文件影響,在C++中尤為嚴(yán)重(重載) 5 不確定性。同一個(gè)頭文件在不同的源文件中可能表現(xiàn)出不同的行為。導(dǎo)致這些這些不同的原因,可能源自源文件(比如該源文件包含的其他頭文件、該源文件中定義的宏等),也可能源自編譯選項(xiàng)。 5 頭文件天然的迫使程序員將聲明與實(shí)現(xiàn)放在不同的文件,有利于踐行“接口與實(shí)現(xiàn)分離”,但同時(shí)容易引發(fā)接口與實(shí)現(xiàn)不一致的情況。C++20中,加入了module。我們先看module 的基本使用姿勢,最后再總結(jié)module比header的優(yōu)勢。
(二)module的使用
| 填充內(nèi)容 |
2.1 實(shí)現(xiàn)一個(gè)最簡單的module
module_hello.cppm:定義一個(gè)完整的hello模塊,并導(dǎo)出一個(gè)say_hello_to方法給外部使用。當(dāng)前各編譯器并未規(guī)定模塊文件的后綴,本文統(tǒng)一使用".cppm"后綴名。".cppm"文件有一個(gè)專用名稱"模塊接口文件",值得注意的是,該文件不光可以聲明實(shí)體,也可定義實(shí)體。
//module_hello.cppm export module hello; import <iostream>; import <string_view>; void internal_helper(){//do something; } export void say_hello_to(const std::string_view& something){internal_helper();std::cout<<"Hello "<<something<<" !"<<std::endl;return; }main函數(shù)中可以直接使用hello模塊:
//main.cpp import hello; import <string_view>;int main(){say_hello_to(std::string_view{"Netease"});internal_helper();//errorreturn 0; }link
總結(jié)
以上是生活随笔為你收集整理的C++20四大之一:module特性详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在markdown中设置字体颜色以及背景
- 下一篇: gcc a.c 究竟经历了什么