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