ClickHouse C++代碼書寫規(guī)范 如何書寫C++

如何編寫代碼++的C?

概述

本文僅供參考。

如果您正在編輯代碼,那么編寫有章法的代碼是很有意義的。

您的書寫風(fēng)格是需要與現(xiàn)有代碼保持一致的。

更簡單的理解代碼(更方便)需要代碼具有統(tǒng)一性。而且,統(tǒng)一的代碼使搜索更加容易。

本文之中諸多規(guī)則非也合理,往往是依例而為。

格式化

您寫的代碼將被自動執(zhí)行clang-format。

縮進(jìn) - 4個空格。配置開發(fā)環(huán)境,以便該選項卡添加四個空格。

新的一行上書寫大括號。(括號結(jié)尾亦如此)

inline void readBoolText (bool &x ,ReadBuffer &buf ){?

????char tmp = '0' ;

? ? readChar (tmp ,buf );?

????x = tmp != '0' ;?

}

但是,如果函數(shù)的全部足夠短(一個語句) - 如果需要,它可以完全放在一行上。在這種情況下,在花括號的周圍放置空白(除了行尾的空格)。

inline size_t mask ()? ? ? ? ? ? ? ? ? ? ? ? ? ? const {? ?return buf_size ()- 1 ; }?

inline size_t place (HashValue x )? ? ? ?const {? ? return x &mask ();? ?}

對于功能來說,圓括號不會有空格。

void reinsert (const Value &x )

memcpy (&buf [ place_value ],&x ,sizeof (x ));


當(dāng)使用if,for,while,...(而不是函數(shù)調(diào)用)時,在左括號之前放置一個空格。

for (為size_t 我= 0 ; 我< 行; 我+ = 存儲。index_granularity )


圍繞二元運(yùn)算符(+, - ,*,/,%,...)以及三元運(yùn)算符?:空間被放置。

UINT16 年= (小號[ 0 ] - '0' )* 1000 + (小號[ 1 ] - '0' )* 100 + (小號[ 2 ] - '0' )* 10 + (小號[ 3 ] - “0 ' ); UInt8 月= (s [ 5 ] - '0' )* 10 + (s [ 6 ] - '0' ); UInt8 day = (s [ 8 ] - '0' )* 10 + (s [ 9 ] - '0' );


如果您張貼一行,則該語句將寫入一個新行,并且縮進(jìn)之前遞增。

中頻(elapsed_ns )消息<< “(” << rows_read_on_server * 10億/ elapsed_ns << “行/秒,?!?<< bytes_read_on_server * 1000.0 / elapsed_ns << “MB立即下載/秒)?!?;


在行內(nèi),如果需要,可以用空格對齊。

dst 。ClickLogID = 點擊。LogID ; dst 。ClickEventID = 點擊。EventID ; dst 。ClickGoodEvent = 點擊。GoodEvent ;


在Carrier周圍? .,->沒有空格。

如有必要,可以將Carrier轉(zhuǎn)移到新行。在這種情況下,空格在它之前增加。


一元運(yùn)算符(,...)不能與空間分隔。--,?++,?*,?&

在逗號之后放置一個空格,之前 - 不存在。for語句中的分號類似。

操作員[]不能被空格分開。

在該表達(dá)式中,間,和前面有一個空格;?之后和之前-未分配。template?<...>template<<>

template < typename TKey ,typename TValue > struct AggregatedStatElement {}


在類和結(jié)構(gòu)中,公共的,私有的,被保護(hù)的被寫在與類/結(jié)構(gòu)相同的層次上,而其他所有的內(nèi)部都是更深的。

template < typename T > class MultiVersion {?

public :///使用對象的版本。

????shared_ptr 管理版本的生命周期。

????using Version = std :: shared_ptr < const T > ;

?????...?

}

如果整個文件上有一個命名空間,除此之外沒有任何必要,那么名稱空間內(nèi)的縮進(jìn)就不需要了。

如果表達(dá)式if,for,while ...的塊由一個語句組成,則花括號不需要寫入。相反,把語句放在一個單獨的行上。這個語句也可以嵌套,如果for,while ...但是如果inner語句包含大括號或者其他的,那么外部的塊應(yīng)該被寫在大括號中。

///完成寫入。for (auto &stream :streams )流。第二個- > finalize ();

行尾應(yīng)該沒有空格。

以UTF-8編碼的源代碼。

在字符串文字中,您可以使用非ASCII。

<< “” << (計時器。消逝()/ chunks_stats 。點擊數(shù))<< “微秒/命中”。;

不要在一行中寫入多個表達(dá)式。

在函數(shù)內(nèi)部,對代碼段進(jìn)行分組,使用不超過一個空行分隔它們。

功能,類別等至少由一個,至多兩個空行相互隔開。

const(引用該值)被寫入類型名稱。

// 正確的const char * pos const std :: string &s // 不正確的char const * pos

當(dāng)你聲明一個指針或引用時,*和&字符被兩邊的空格分開。

// 正確的const char * pos // 不正確的const char * pos const char * pos

當(dāng)使用模板類型時,寫using(除了最簡單的情況)。

也就是說,模板參數(shù)僅在using代碼中指定,然后在代碼中不重復(fù)。

using?可以在本地聲明,例如在一個函數(shù)內(nèi)。

// 正確使用FileStreams = std :: map < std :: string ,std :: shared_ptr < Stream >> ; FileStreams 流; // 不正確的std :: map < std :: string ,std :: shared_ptr < Stream > 流;

你不能在同一個聲明中聲明多個不同類型的變量。

// true int x ,* y ;

C風(fēng)格演員沒有使用。

//不正確的std :: cerr << (int )c << ; std :: endl ; //正確的std :: cerr << static_cast < int > (c )<< std :: endl ;

在課程和結(jié)構(gòu)中,分別在每個范圍內(nèi)分別分組和分組。

對于不是很大的類/結(jié)構(gòu),您不能將方法聲明與實現(xiàn)分開。

類似于任何類/結(jié)構(gòu)中的小方法。

對于模板類/結(jié)構(gòu),最好不要將方法聲明與實現(xiàn)分開(否則它們必須在同一個翻譯單元中定義)。

代碼寬度不能超過80個字符。有可能在140。

如果不需要postfix,請始終使用前綴遞增/遞減。

對于(姓名:: 為const_iterator IT = COLUMN_NAMES 。在開始(); IT != COLUMN_NAMES 。結(jié)束(); ++ IT )

評論(注釋)

有必要在所有需要解釋的地方寫評論。

這非常重要。我們不應(yīng)當(dāng)為他人創(chuàng)造閱讀代碼的多余工作,而應(yīng)當(dāng)簡便的介紹代碼的內(nèi)容。

/ **一部分內(nèi)存,可以使用。? * 例如,如果internal_buffer為1MB ,并且有唯一的圖10中,加載到緩沖“從文件中的字節(jié)進(jìn)行讀取,? *當(dāng)時working_buffer將具有僅為10字節(jié)大小床? *(working_buffer.end()點位置將可用的那些10個字節(jié)之后的閱讀)。? * /

注釋可以盡可能詳細(xì)。

注釋被寫入適當(dāng)?shù)拇a。在極少數(shù)情況下 - 可以放置于同一行之后。

/** Parses and executes the query.*/

void executeQuery( ReadBuffer & istr,? /// Where to read the query from (and data for INSERT, if? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?applicable)WriteBuffer & ostr,/// Where to write the result

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Context? & context,/// DB, tables, data types, engines, functions, aggregate? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? functions...BlockInputStreamPtr & query_plan,///executedQueryProcessingStage::Enum

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?stage=QueryProcessingStage::Complete/// Up to which stage process the SELECT query)

注釋只能用英文書寫。

編寫一個庫時,請在最重要的頭文件中發(fā)布一個關(guān)于它是什么的詳細(xì)注釋。

你不能寫評論,不提供額外的信息。特別是,你不能寫這樣的空的評論:

/ * *過程如何名稱:*原程序名稱:*作者:*創(chuàng)造條件的日期:*修改的日期:*修改作者:*原始文件名:*用途:*的意圖:*的名稱:*在類中使用:*常量:*局部變量:*參數(shù):*創(chuàng)建日期:*目的:* /

(實施例從資源采取http://home.tamk.fi/~jaalto/course/coding-style/doc/unmaintainable-code/

您不能在每個文件的開頭寫入垃圾評論(作者,創(chuàng)建日期...)。

單行注釋以三個斜杠開始:///多行與/**。這樣的評論被認(rèn)為是“記錄”。

注意:這些注釋可用于使用Doxygen生成文檔。但是,實際上,Doxygen并沒有被使用,因為使用IDE功能導(dǎo)航代碼要方便得多。

在多行注釋的開始和結(jié)尾,不應(yīng)該有空行(除了多行注釋關(guān)閉的行外)。

對于注釋的代碼塊,通常不使用“記錄”注釋。

在提交之前刪除注釋的代碼塊。

不要在評論或代碼中寫粗話。

不要用大寫字母寫。不要使用不必要的標(biāo)點符號。

///WHAT A FALIURE

不要在評論中撰寫分隔線。

/// *********************************************** *******

在評注中寫下對話是沒有必要的(最好口頭說)。

///你為什么要做這個東西?

不要在塊的末尾寫下關(guān)于這個塊的評論

/// for

名稱

變量和類成員的名稱是帶有下劃線的小寫字母。

size_t max_block_size ;

函數(shù)(方法)的名字是用小寫字母camelCase。

std :: string getName ()const override { return “Memory” ; }

類(結(jié)構(gòu))的名稱是大寫字母的CamelCase。不使用接口以外的前綴。

類StorageMemory :公共IStorage

使用的名稱以及類,或者您可以在最后添加_t。

類型名稱 - 模板參數(shù):在簡單情況下 - T;?T,U;?T1,T2。

在更復(fù)雜的情況下 - 無論是類名,還是可以將字母T添加到開頭。

template < typename TKey ,typename TValue > struct AggregatedStatElement

常量的名稱 - 模板的參數(shù):或者變量的名稱,或者簡單情況下的N。

template < bool without_www > struct ExtractDomain

對于抽象類(接口),可以將字母I添加到名稱的開頭。

類IBlockInputStream

如果變量在本地使用,那么可以使用簡稱。

在其他情況下 - 使用描述含義的相當(dāng)詳細(xì)的名稱。

bool info_successfully_loaded = false ;

定義-s - 帶下劃線的ALL_CAPS。全局常量 - 也是。

#define MAX_SRC_TABLE_NAMES_TO_STORE 1000

具有代碼的文件的名稱根據(jù)其中的內(nèi)容根據(jù)樣式命名。

如果在文件中有一個類 - 在CamelCase中將該文件命名為一個類。

如果文件中有一個函數(shù) - 將該文件命名為函數(shù) - 在camelCase中。

如果名稱包含縮寫,則:

對于變量名,所有的縮寫都是用小寫字母mysql_connection(不mySQL_connection)。

對于類和函數(shù)的名字,大的字母保留在縮寫MySQLConnection(not?MySqlConnection)中。

應(yīng)立即使用用于初始化類的相應(yīng)成員的構(gòu)造函數(shù)的參數(shù)以及類的成員,并在末尾添加下劃線。

FileQueueProcessor (const的在std :: :字符串和path_ ,常量在std :: :字符串和prefix_ ,在std :: shared_ptr的< 文件處理器> handler_ ):路徑(path_ ),前綴(prefix_ ),處理器(handler_ ),日志(&記錄器:: 的get (“FileQueueProcessor” )){ }

您也可以像構(gòu)造函數(shù)的成員一樣調(diào)用構(gòu)造函數(shù)的參數(shù)(不要添加下劃線),但只有在構(gòu)造函數(shù)的主體中不使用此參數(shù)時才可以。

命名局部變量和類成員沒有區(qū)別(不需要前綴)。

定時器(不是m_timer )

enum-e中的常量 - 使用大寫字母的CamelCase。ALL_CAPS也是可以接受的。如果枚舉不在本地,則使用枚舉類。

枚舉類CompressionMethod { QuickLZ = 0 ,LZ4 = 1 ,};

所有的名字都是英文的。俄語字符、漢語字符、日語字符等不得使用。

不要使用Stroka?

名稱中的縮寫(來自不同單詞的幾個字母)只有在被普遍接受的情況下才可以使用(如果縮短可以在英文維基百科中進(jìn)行解碼或進(jìn)行搜索查詢): AST,SQL。

No NVDH

只有在廣泛使用這種縮減的情況下,才能使用縮略語的縮略語。

但是,如果縮寫的代碼全稱就在注釋附近出現(xiàn)過,也可以使用縮寫。

C ++源文件名只能有.cpp擴(kuò)展名。頭文件 - 只有.h。

如何編寫代碼

內(nèi)存管理。

手動刪除內(nèi)存(刪除)只能在庫代碼中使用。

而在庫代碼中,刪除操作符只能在析構(gòu)函數(shù)中使用。

在應(yīng)用程序代碼中,應(yīng)該完成內(nèi)存被擁有它的某個對象釋放。

例子:

將對象放在堆棧上,或者使其成為另一個類的成員是最簡單的。

對于大量的小物件,使用容器。

要自動釋放堆中分配的少量對象,請使用shared_ptr / unique_ptr。

資源管理。

使用RAII并參見上面的段落。

錯誤處理。

使用例外。在大多數(shù)情況下,您只需要拋出異常,而不需要捕捉(因為RAII)。

在離線數(shù)據(jù)處理程序中,通常你不能捕捉異常。

在處理自定義請求的服務(wù)器中,通常在連接處理程序的頂部捕獲異常就足夠了。

在線程函數(shù)中,你應(yīng)該捕獲并記住所有異常,在加入之后將它們拋入主線程中。

///如果還沒有計算,如果(!Started ){ calculate (); 開始= 真; } else ///如果計算已經(jīng)在運(yùn)行,請等待池的結(jié)果。wait (); 如果(例外)異常- > rethrow ();

不要“不分青紅皂白地”吞食“例外。在任何情況下,都不要將所有例外不加區(qū)分地轉(zhuǎn)換成日志中的消息。

不要。catch?(...)?{}

如果您需要忽略一些例外情況,那么只需要忽略特定的例外情況,其余部分則會退回。

捕捉(const的DB :: 異常&? ){ 如果(? 。代碼()== ErrorCode的:: UNKNOWN_AGGREGATE_FUNCTION )返回nullptr ; 否則扔; }

當(dāng)使用使用返回碼或errno的函數(shù)時,檢查結(jié)果并拋出異常。

if (0 != close (fd ))throwFromErrno (“Can not close file” + file_name ,ErrorCodes :: CANNOT_CLOSE_FILE );

斷言不被使用。

異常類型。

在應(yīng)用程序代碼中,您不需要使用復(fù)雜的異常層次結(jié)構(gòu)。希望系統(tǒng)管理員能夠理解例外文本。

從析構(gòu)函數(shù)中出現(xiàn)的異常。不建議使用,但可以接受。

使用以下選項:

做一個函數(shù)(done()或finalize()),它可以讓你事先執(zhí)行所有的工作,在這個過程中可能會發(fā)生異常。如果這個函數(shù)被調(diào)用,那么在析構(gòu)函數(shù)中不應(yīng)該有任何異常。

過于復(fù)雜的工作(例如通過網(wǎng)絡(luò)發(fā)送數(shù)據(jù))在析構(gòu)函數(shù)中根本無法完成,期望用戶提前調(diào)用該方法來完成工作。

如果在析構(gòu)函數(shù)中發(fā)生異常,建議不要“吞食”它,而是將信息輸出到日志(如果在此處有日志記錄器)。

在簡單的程序,如果相關(guān)的異常沒有被捕獲,并導(dǎo)致與在日志中記錄信息的工作完成后,你可以不用擔(dān)心從析構(gòu)函數(shù)發(fā)出的異常,因為調(diào)用的std ::終止(在默認(rèn)noexcept在C ++ 11的情況下)是處理異常的可接受的方式。

獨立的代碼塊。

在一個函數(shù)內(nèi)部,可以創(chuàng)建一個單獨的代碼塊,以便在其中創(chuàng)建一些局部變量,并在退出塊時調(diào)用相應(yīng)的析構(gòu)函數(shù)。

塊塊= 數(shù)據(jù)。in - > read (); { std :: lock_guard < std :: mutex > lock (mutex ); 數(shù)據(jù)。ready = true ; 數(shù)據(jù)。block = block ; } Ready_any 。set ();

多線程。

在離線數(shù)據(jù)處理程序中:

首先,在單個處理器內(nèi)核上實現(xiàn)或多或少的最大性能,然后您可以并行化代碼,但只在必要的時候使用。

在服務(wù)器程序中:

使用線程池來處理請求。目前,我們沒有任何需要使用用戶空間上下文切換的任務(wù)。

叉不用于并行化。

流的同步。

通常,你可以單獨的流數(shù)據(jù)寫入到不同的存儲位置(更好 - 在不同的緩存行),并且不使用流同步(除joinAll)。

如果需要同步,在大多數(shù)情況下,使用lock_guard下的互斥鎖就足夠了。

在其他情況下,使用系統(tǒng)同步原語。不要用忙等待。

原子操作只能用于最簡單的情況。

除非你是專家,否則你不需要自己寫一個無鎖的數(shù)據(jù)結(jié)構(gòu)。

參考和指標(biāo)。

在大多數(shù)情況下,更喜歡鏈接。

常量。

可以使用常量引用,常量指針,const_iterator,常量方法。

考慮到const是“缺省”寫入的變體,只有必要時才需要const的缺失。

對于通過值傳遞的變量,const通常是沒有意義的。

無符號。

如果需要,使用無符號。

數(shù)字類型。

使用類型UInt8,UInt16,UInt32,UInt64,Int8,Int16,Int32,Int64以及size_t,ssize_t,ptrdiff_t。

不要使用signed / unsigned long,long long,short;?signed char,unsigned char和char。

傳遞參數(shù)。

復(fù)合值是通過引用傳遞的(包括std :: string)。

如果該函數(shù)捕獲在堆上創(chuàng)建的對象的所有權(quán),則使參數(shù)類型為shared_ptr或unique_ptr。

返回值。

在大多數(shù)情況下,只需返回值。不要寫[return std :: move(res)] {。Strike}。

如果在函數(shù)內(nèi)部在堆上創(chuàng)建一個對象并發(fā)出,則返回shared_ptr或unique_ptr。

在少數(shù)情況下,可能需要通過函數(shù)參數(shù)返回一個值。在這種情況下,參數(shù)是一個鏈接。

使用AggregateFunctionPtr = std :: shared_ptr < IAggregateFunction > ; / **允許您通過名稱創(chuàng)建一個聚合函數(shù)。? * / class AggregateFunctionFactory { public :AggregateFunctionFactory (); AggregateFunctionPtr get (const String &name ,const DataTypes &argument_types )const ;

命名空間。

對于應(yīng)用程序代碼,您不需要使用單獨的名稱空間。

對于小型圖書館 - 不需要。

對于不是很小的圖書館 - 把所有的東西放在名字空間里

在.h文件庫中,可以使用名稱空間詳細(xì)信息來獲取應(yīng)用程序代碼不需要的實現(xiàn)細(xì)節(jié)。

在.cpp文件中,可以使用靜態(tài)或匿名命名空間來隱藏字符。

此外,命名空間可以用于枚舉,以便相應(yīng)的名稱不會進(jìn)入外部名稱空間(但最好使用枚舉類)。

延遲初始化。

通常,如果您需要參數(shù)來初始化,請不要為了邏輯而編寫構(gòu)造函數(shù)。

如果那么你需要延遲初始化,那么你可以添加一個默認(rèn)的構(gòu)造函數(shù)(這將創(chuàng)建一個不正確的狀態(tài)的對象)?;蛘?,對于少數(shù)對象,可以使用shared_ptr / unique_ptr。

Loader (DB :: Connection * connection_ ,const std :: string &query ,size_t max_block_size_ ); ///用于延遲初始化Loader (){}

虛擬功能。

如果這個類不是為多態(tài)使用而設(shè)計的,那么你就不需要使這個函數(shù)虛擬化。這也適用于析構(gòu)函數(shù)。

編碼。

UTF-8被廣泛使用。使用std::string,。未使用,。char?*std::wstringwchar_t

日志記錄。

查看代碼中的所有示例。

在提交之前,刪除所有無意義和調(diào)試日志,以及其他類型的調(diào)試輸出。

內(nèi)部循環(huán)的每個迭代都不應(yīng)該有日志記錄,即使是跟蹤級別也是如此。

在任何級別的日志記錄中,日志都應(yīng)該可以讀取。

日志記錄應(yīng)該主要用在應(yīng)用程序代碼中。

日志中的信息應(yīng)該用英文書寫。

系統(tǒng)管理員可以理解日志。

不需要在日志中寫下臟話。

日志使用UTF-8編碼。偶爾,日志中可以使用非ASCII字符。

I / O.

在內(nèi)部循環(huán)(在程序的關(guān)鍵部分),你不能使用iostreams(包括,絕不使用stringstream)。

而是使用DB / IO庫。

日期和時間。

查看DateLUT庫。

Include

頭文件僅用于,包括guard-s不需要寫。#pragma?once

Using

不使用名稱空間。

使用一些具體的東西 - 這是可能的。在本地更好 - 在課堂上或功能上。

如果沒有必要,則不需要使用函數(shù)的尾隨返回類型。

[auto f() ->? void;] {.strike}

你不需要像這樣聲明和初始化變量:

auto s = std :: string { “Hello” };

這是必要的:

std :: string s = “Hello” ; std :: string s { “Hello” };

對于虛擬函數(shù),在基類中寫入虛擬,在繼承類中寫入覆蓋,不寫虛擬。

未使用的語言特性++的C?

虛擬繼承不使用。

不使用C ++ 03的異常限定符。

函數(shù)try塊不被使用,除了測試中的主函數(shù)。

平臺

我們編寫一個非跨平臺的代碼(針對特定的平臺)。

盡管其他條件相同,但是更多或更少的跨平臺或便攜代碼是優(yōu)選的。

語言 - C ++ 17。

編譯器是gcc。目前(2017年12月),代碼將版本7.2。(也可以用clang 5編譯代碼)

使用標(biāo)準(zhǔn)庫(實現(xiàn)libstdc ++或libc ++)。

操作系統(tǒng) - Linux Ubuntu,不比Precise大。

該代碼是為體系結(jié)構(gòu)x86_64的處理器編寫的。

一套指令是我們的服務(wù)器支持的最低要求?,F(xiàn)在是SSE4.2。

編譯標(biāo)志被使用。-Wall?-Wextra?-Werror

使用帶有除了那些困難的所有庫靜態(tài)鏈接到靜態(tài)連接(見。結(jié)論LDD命令)。

代碼是用程序集的發(fā)布參數(shù)開發(fā)和調(diào)試的。

工具

KDevelop是一個很好的開發(fā)環(huán)境。

對于調(diào)試,使用gdb,valgrind(memcheck),strace,-fsanitize = ...,tcmalloc_minimal_debug。

性能分析使用Linux Perf,valgrind(callgrind),strace -cf。

來源于Git。

用CMake構(gòu)建。

程序使用deb包進(jìn)行布局。

Master承諾不應(yīng)該破壞項目的組裝。

所收集的程序的工作能力僅保證個人審計。

盡可能經(jīng)常提交,包括非工作代碼。

要做到這一點,使用 branch。

如果您的主代碼還沒有準(zhǔn)備好,那么在推送它之前 - 從程序集中排除它,您將不得不修改它或在幾天內(nèi)刪除它。

對于不重要的更改,使用branch。應(yīng)該將分支上傳到服務(wù)器。

不必要的代碼從source中刪除。

使用標(biāo)準(zhǔn)的C ++庫14(允許使用 Experimental 擴(kuò)展)以及 Poco 框架。

如有必要,您可以使用軟件包中操作系統(tǒng)中可用的任何已知庫。

如果有一個好的現(xiàn)成的解決方案,那就使用它,即使你需要為此安裝一個庫。

(但要做好準(zhǔn)備,因為有時候你必須從代碼中剔除不好的庫。

如果軟件包中沒有庫,或者版本足夠舊,或者沒有以正確的方式編譯,則可以使用未從軟件包安裝的庫。

如果庫足夠小,并且沒有自己的構(gòu)建系統(tǒng),則應(yīng)將其文件包含在項目的contrib目錄中。

總是優(yōu)先考慮已經(jīng)在使用的library庫。

一般

寫盡可能少的代碼。

嘗試最簡單的解決方案。

如果您不知道程序?qū)?zhí)行什么操作,以及內(nèi)部循環(huán)如何工作,則無需編寫代碼。

在最簡單的情況下,使用 using 而不是class/struct。

如果可能的話,不要寫復(fù)制構(gòu)造函數(shù),賦值運(yùn)算符,析構(gòu)函數(shù)(除非虛擬類至少包含一個虛函數(shù)),移動構(gòu)造函數(shù)和移動賦值。也就是說,編譯器生成的相應(yīng)函數(shù)正常工作。你可以使用默認(rèn)。

簡化和減少代碼量是值得歡迎的。

此外

顯式的std ::用于stddef.h中的類型。

建議不要指定。也就是說,建議編寫size_t而不是std :: size_t - 因為它更加精簡。

但是,如果你想,你仍然可以分配std :: - 這個選項也是可以接受的。

基本的std ::用于標(biāo)準(zhǔn)C庫中的函數(shù)。

不推薦。也就是說,寫入memcpy而不是std :: memcpy。

原因 - 有類似的非標(biāo)準(zhǔn)功能,例如memmem。我們可以使用和偶爾使用這些功能。這些函數(shù)在命名空間std中找不到。

如果你在任何地方都寫std :: memcpy而不是memcpy,那么在不用std ::的情況下查看memmem將會很不方便。

但是,指定std ::也是可以接受的,如果這更像。

如果標(biāo)準(zhǔn)C ++庫中有類似物,則使用C中的函數(shù)。

如果這種使用更有效,這是允許的。

例如,要復(fù)制長塊的內(nèi)存,請使用memcpy而不是std :: copy。

傳遞長函數(shù)參數(shù)。

可以使用任何傳輸方式,類似于下面列出的傳輸方式:

功能(T1 x1 ,T2 x2 )

函數(shù)(size_t left ,size_t right ,const &RangesInDataParts 范圍,size_t 限制)

函數(shù)(size_t left ,size_t right ,const &RangesInDataParts 范圍,size_t 限制)

函數(shù)(size_t left ,size_t right ,const &RangesInDataParts 范圍,size_t 限制)

函數(shù)(size_t left ,size_t right ,const &RangesInDataParts 范圍,size_t 限制)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • C++運(yùn)算符重載-下篇 本章內(nèi)容:1. 運(yùn)算符重載的概述2. 重載算術(shù)運(yùn)算符3. 重載按位運(yùn)算符和二元邏輯運(yùn)算符4...
    Haley_2013閱讀 1,533評論 0 49
  • 接著上節(jié) condition_varible ,本節(jié)主要介紹future的內(nèi)容,練習(xí)代碼地址。本文參考http:/...
    jorion閱讀 15,056評論 1 5
  • 再讀高效c++,頗有收獲,現(xiàn)將高效c++中的經(jīng)典分享如下,希望對你有所幫助。 1、盡量以const \enum\i...
    橙小汁閱讀 1,312評論 0 1
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,683評論 1 51
  • 接著上節(jié) mutex,本節(jié)主要介紹atomic的內(nèi)容,練習(xí)代碼地址。本文參考http://www.cplusplu...
    jorion閱讀 74,103評論 1 14

友情鏈接更多精彩內(nèi)容