當前位置:首頁 » 編程軟體 » c模板元編程

c模板元編程

發布時間: 2023-05-15 22:27:19

『壹』 只會c語言和c++,可以直接學安卓開發嗎

c語言是面向過程的編程語言,c++是支持面向過程、面向對象對象、范型編程的編程語言。我不給你說抽象的東西了,直白的說吧:當你用c語言編程的時候就是面向過程編程,當你用到c++的類和繼承來編寫程序的時候就是面向對象編程,當你把類型當做參數來使用的時候就是范型編程,當你編寫的代碼在編譯時就得出結果就是模板元編程了,當你的c++程序同時具有以上情況的時候就是混合編程了。c++是比c更強大的語言,不只是面向對象和面向過程的區別。
安卓開發主要用的是java語言。pc上的編程語言你可以看看編程語言排行榜。
java語言與c語言的區別是:
java語言是面向對象的,c是面向過程的。
java與c++的區別是:java語言只是面向對象的,而且java比c++簡單。
關於怎麼用好c++的面向對象特性,你可以去找一些面向對象編程額書籍來看看。
注意了:面向對象和面向對象編程不是一回事,前者包含後者。

『貳』 C語言是什麼

C語言是國際上廣泛流行的,很有發展前途的計算機高級語言.它適合作為系統描述語言,即可用來編寫系統軟體,也可用來編寫應用軟體.

早期的操作系統等系統軟體主要是用匯編語言編寫的(包括 UNIX操作系統在內).由於匯編語言依賴於計算機硬體,程序的可讀性和可移植性都比較差.為了提高可讀性和可移植性,最好改用高級語言,但一般的高級語言難以實現匯編語言的某些功能(匯編語言可以直接對硬體進行操作),例如:對內存地址的操作,位操作等).人們設想能否找到一種既具有一般高級語言特性, 又具有低級語言特性的語言,集它們的優點於一身.於是,C語言就在這種情況下應運而生了.

C語言是在B語言的基礎上發展起來的,它的根源可以追溯到ALGOL 60. 1960年出現的ALGOL 60是一種面向問題的高級語言,它離硬體比較遠,不宜用來編寫系統程序.1963年英國的劍橋大學推出了CPL(CombinedProgram- ming Language)語言.CPL語言在ALGOL 60的基礎上接近了硬體一些,但規模比較大,難以實現.1967年英國劍橋大學的Matin Richards對 CPL語言作了簡化,推出了BCPL(Basic Combined Programming Language)語言.1970年美國貝爾實驗室的 Ken Thompson以 BCPL語言為基礎,又作了進一步簡化,設計出了很簡單的而且很接近硬體的 B語言( 取 BCPL的第一個字母),並用 B語言寫第一個UNIX操作系統,在PDP-7上實現. 1971年在PDP-11/20上實現了B語言,並寫了UNIX操作系統.但B語言過於簡單,功能有限.1972年至 1973年間,貝爾實驗室的 D.M.Ritchie在B語言的基礎上設計出了C語言(取 BCPL的第二個字母).C語言既保持了BCPL和B語言的優點(精練,接近硬體),又克服了它們的缺點(過於簡單,數據無類型等). 最初的C語言只是為描述和實現UNIX操作系統提供一種工作語言而設計的.1973年,K.Thom- pson和D.M.ritchie兩人合作把UNIX的90%以上用 C改寫(UNIX第5版.原來的 UNIX操作系統是1969年由美國的貝爾實驗室的 K.Thompson和D.M.Ritchie開發成功的,是用匯編語言寫的).

後來,C語言多次作了改進,但主要還是在貝爾實驗室內部使用.直到1- 975年UNIX第6版公布後 ,C語言的突出優點才引起人們普遍注意.1977年出現了不依賴於具體機器的C語言編譯文本《可移植C語言編譯程序》,使C移植到其它機器時所做的工作大大簡化了,這也推動了UNIX操作系統迅速地在各種機器上實現.例如,VAX,AT&T等計算機系統都相繼開發了UNIX.隨著 UNIX的日益廣泛使用,C語言也迅速得到推廣.C語言和UNIX可以說是一對孿生兄弟,在發展過程中相輔相成.1978年以後,C語言已先後移植到大, 中,小,微型機上,已獨立於UNIX和PDP了.現在C語言已風靡全世界,成為世界上應用最廣泛的幾種計算機語言之一.

以1978年發表的UNIX第7版中的C編譯程序為基礎,Brian W.Kernighan和 Dennis M.Ritchie(合稱K&R)合著了影響深遠了名著《The C Programming Lan- guage》,這本書中介紹的C語言成為後來廣泛使用的C語言版本的基礎,它被稱為標准C.1983年,美國國家標准化協會(ANSI)根據C語言問世以來各種版本對C的發展和擴充 ,制定了新的標准,稱為ANSI C.ANSI C比原來的標准C有了很大的發展.K&R在1988年修改了他們的經典著作《The C Progra- mming Language》 ,按照ANSI C的標准重新寫了該書.1987年,ANSI C又公布了新標准--87 ANSI C .目前流行的C編譯系統都是以它為基礎的.

『叄』 現代C/C++編譯器有多智能

最近在搞C/C++代碼的性能優化,發現很多時候自以為的優化其實編譯器早就優化過了,得結合反匯編才能看出到底要做什麼樣的優化。
請熟悉編譯器的同學結合操作系統和硬體談一談現代c/c++編譯器到底有多智能吧。哪些書本上的優化方法其實早就過時了?
以及程序員做什麼會讓編譯器能更好的自動優化代碼?
舉個栗子:
1,循環展開,大部分編譯器設置flag後會自動展開;
2,順序SIMD優化,大部分編譯器設置flag後也會自動優化成SIMD指令;
3,減少中間變數,大部分編譯器會自動優化掉中間變數;
etc.
查看代碼對應的匯編:
Compiler Explorer
【以下解答】
舉個之前看過的例子:
int calc_hash(signed char *s){ static const int N = 100003; int ret = 1; while (*s) { ret = ret * 131 + *s; ++ s; } ret %= N; if (ret < 0) ret += N; //注意這句 return ret;}
【以下解答】
舉個簡單例子,一到一百求和
#include int sum() { int ret= 0; int i; for(i = 1; i <= 100; i++) ret+=i; return ret;}int main() { printf("%d\n", sum()); return 0;}
【以下解答】
話題太大,碼字花時間…
先放傳送門好了。
請看Google的C++編譯器組老大Chandler Carruth的演講。這個演講是從編譯器研發工程師的角度出發,以Clang/LLVM編譯C++為例,向一般C++程序員介紹理解編譯器優化的思維模型。它講解了C++編譯器會做的一些常見優化,而不會深入到LLVM具體是如何實現這些優化的,所以即使不懂編譯原理的C++程序員看這個演講也不會有壓力。
Understanding Compiler Optimization - Chandler Carruth - Opening Keynote Meeting C++ 2015
演示稿:https://meetingcpp.com/tl_files/mcpp/2015/talks/meetingcxx_2015-understanding_compiler_optimization_themed_.pdf
錄像:https://www.youtube.com/watch?v=FnGCDLhaxKU(打不開請自備工具…)
Agner Fog寫的優化手冊也永遠是值得參考的文檔。其中的C++優化手冊:
Optimizing software in C++ - An optimization guide for Windows, Linux and Mac platforms - Agner Fog
要稍微深入一點的話,GCC和LLVM的文檔其實都對各自的內部實現有不錯的介紹。
GCC:GNU Compiler Collection (GCC) Internals
LLVM:LLVM』s Analysis and Transform Passes
========================================
反模式(anti-patterns)
1. 為了「優化」而減少源碼中局部變數的個數
這可能是最沒用的手工「優化」了。特別是遇到在高級語言中「不用臨時變數來交換兩個變數」這種場景的時候。
看另一個問題有感:有什麼像a=a+b;b=a-b;a=a-b;這樣的演算法或者知識? - 編程
2. 為了「優化」而把應該傳值的參數改為傳引用
(待續…)
【以下解答】
推薦讀一讀這里的幾個文檔:
Software optimization resources. C++ and assembly. Windows, Linux, BSD, Mac OS X
其中第一篇:http://www.agner.org/optimize/optimizing_cpp.pdf
講解了C++不同領域的優化思路和問題,還有編譯器做了哪些優化,以及如何代碼配合編譯器優化。還有優化多線程、使用向量指令等的介紹,推薦看看。
感覺比較符合你的部分需求。
【以下解答】
一份比較老的slides:
http://www.fefe.de/source-code-optimization.pdf
【以下解答】
利用C++11的range-based for loop語法可以實現類似python里的range生成器,也就是實現一個range對象,使得
for(auto i : range(start, stop, step))
【以下解答】
我覺得都不用現代。。。。寄存器分配和指令調度最智能了
【以下解答】
每次編譯poco庫的時候我都覺得很為難GCC
【以下解答】
有些智能並不能保證代碼變換前後語義是等價的
【以下解答】
誒誒,我錯了各位,GCC是可以藉助 SSE 的 xmm 寄存器進行優化的,經 @RednaxelaFX 才知道應該添加 -march=native 選項。我以前不了解 -march 選項,去研究下再來補充為什麼加和不加區別這么大。
十分抱歉黑錯了。。。以後再找別的點來黑。
誤導大家了,實在抱歉。(??ˇ?ˇ??)
/*********以下是並不正確的原答案*********/
我是來黑 GCC的。
最近在搞編譯器相關的活,編譯OpenSSL的時候有一段這樣的代碼:
BN_ULONG a0,a1,a2,a3; // EmmetZC 註:BN_ULONG 其實就是 unsigned longa0=B[0]; a1=B[1]; a2=B[2]; a3=B[3];A[0]=a0; A[1]=a1; A[2]=a2; A[3]=a3;
【以下解答】
提示:找不到對象
【以下解答】
忍不住抖個機靈。
私以為正常寫代碼情況下編譯器就能優化,才叫智能編譯器。要程序員絞盡腦汁去考慮怎麼寫代碼能讓編譯器更好優化,甚至降低了可讀性,那就沒有起到透明屏蔽的作用。
智能編譯器應該是程序猿要較勁腦汁才能讓編譯器不優化。
理論上是這樣的。折疊我吧。
【以下解答】
編譯器智能到每次我都覺得自己很智障。
【以下解答】
雖然題主內容里是想問編譯器代碼性能優化方面的內容,但題目里既然說到編譯器的的智能,我就偏一下方向來說吧。
有什麼更能展示編譯器的強大和智能?
自然是c++的模版元編程
template meta programming
簡單解釋的話就是寫代碼的代碼,寫的還是c++,但能讓編譯器在編譯期間生成正常的c++代碼。
沒接觸過的話,是不是聽上去感覺就是宏替換的加強版?感覺不到它的強大呢?
只是簡單用的話,效果上這樣理解也沒什麼
但是一旦深入下去,尤其翻看大神寫的東西,這明明看著就是c++的代碼,但TM怎麼完全看不懂他在干什麼?後來才知道這其實完全是另外一個世界,可是明明是另外一個世界的東西但它又可以用來做很多正常c++能做的事....
什麼?你說它好像不能做這個,不能做那個,好像做不了太多東西,錯了,大錯特錯。就像你和高手考試都考了100分的故事一樣,雖然分數一樣,但你是努力努力再努力才得了滿分,而高手只是因為卷面分只有100分.....在元編程面前,只有想不到,沒有做不到。
再回頭看看其他答案,編譯器順手幫你求個和,丟棄下無用代碼,就已經被驚呼強大了,那模板元編程這種幾乎能在編譯期直接幫你「生成」包含復雜邏輯的c++代碼,甚至還能間接「執行」一些復雜邏輯,這樣的編譯器是不是算怪獸級的強大?
一個編譯器同時支持編譯語法相似但結果不同卻又關聯的兩種依賴語言,這個編譯器有多強大多智能?
寫的人思維都要轉換幾次,編譯器轉著圈嵌著套翻著番兒地編譯代碼的代碼也肯定是無比蛋疼的,你說它有多強大多智能?
一個代碼創造另外一個代碼,自己能按照相似的規則生成自己,是不是聽上去已經有人工智慧的發展趨勢了?
上帝說,要有光,於是有了光。
老子曰,一生二,二生三,三生萬物。
信c++,得永生!
===
FBI WARNING:模板元編程雖然很強大,但也有不少缺點,尤其對於大型項目,為了你以及身邊同事的身心健康,請務必適度且謹慎的使用。勿亂入坑,回頭是岸。
【以下解答】
c++11的auto自動類型推斷算么....
【以下解答】
智能到開不同級別的優化,程序行為會不同 2333
【以下解答】
這個取決於你的水平

『肆』 IT面試經驗:C/C++程序員需要掌握哪些知識

概括來說,開發中常用到的功能:串口通信、網口通信、資料庫訪問、數據加解密處理等等。這些方面的知識都要掌握的,細說的話主要有以下幾個方面:

一、語言相關

1、基礎(Basic)

(1)變數與基本類型:語言內置類型、常量、變數的初始化、變數的作用域、變數的 限定符、變數引用、枚舉; (2)typedef 和#define;

(3)數值與指針:數組定義與初始化、多維數值、指針操作;

(4)表達式:算術/邏輯計算、位運算、優先順序、類型轉換;

(5)語句:簡單語句、聲明/定義語句、復合語句、條件/循環控制語句、異常處理語 句;

(6)函數:函數聲明、參數傳遞、堆棧概念、函數重載;

(7)標准IO:條件狀態、緩沖區、文件流、字元流、本地化;

(8)類和數據抽象:類的定義與聲明、類的構造函數、靜態成員、拷貝構造函數、操 作符重載、類型轉換;

(9)面向對象編程:數據(封裝)抽象、繼承、多態(動態綁定);

2、進階(Advance)

(1)模板與泛型編程:模板定義、實例化、類模板成員、重載、特化; (2)智能指針:auto_ptr、shared_ptr、scoped_ptr;

(3)STL容器:順序容器(vector、list、deque、queue、priority_queue、string)和關 聯容器(map、set、multimap、multiset); (4)STL演算法:迭代器、演算法; (5)常用復雜數據結構:hash_map、boost.any、boost. array、boost. regex、boost. variant、 boost. multi_array、boost. pointer_container;

3、高級(Expert)

(1)高級泛型編程:表達式模板、模板元編程、Concept編程;

(2)程序架構,內存池,線程池;

(3)高級抽象:boost.mpl、boost.lambda、boost.fusion、boost.proto;

(4)範式應用:boost.spirit;

(5)應用程序庫:boost.asio 、boost.graph、blitz++、Loki、CGAL、uBLAS;

二、系統相關

1、基礎(Basic)

(1)Windows API之基礎服務:文件系統、注冊表、內存管理、DLL、多媒體;

(2)Windows API之內核對象:句柄、信號、線程、進程、互斥、事件、文件映射、 命名管道、郵槽、計時器、完成埠;

(3)Windows API之圖形設備介面:設備上下文、列印、字體、筆/刷、路徑、區域、 點陣圖;

(4)Windows API之圖形用戶界面:窗口、標題、菜單、狀態欄、消息、圖標、按鈕、 編輯框、組合框、列表框、滾動條、通用對話框;

(5)環境配置及Shell編程:環境變數、右鍵菜單、屬性、關聯; (6)Socket編程; (7)Web相關API; 2、進階(Advance)

(1)MFC/ATL:文檔視圖結構、對話框、通用控制項、OleDB、WinInet; (2)COM、自動化、ActiveX:Office開發、IE插件、VBA; (3)高級圖形系統:OpenGL、DirectX; (4)二次開發:ObjectArx;

三、計算相關

1、計算機圖形學

(1)向量:點積、叉積、求模、單位化、復合運算;(basic)

(2)矩陣:算術運算、平移/旋轉/縮放/錯切等變換、求逆、特徵值;(basic) (3)四元組合歐拉角:與其他表示轉換;(advance) (4)參數曲線/曲面:貝塞爾、(非)均勻有理樣條;(advance) (5)三維幾何體的構造與描述;(expert) 2、計算幾何

(1)幾何查找與判斷:點與線、線與線、點與多邊形;(basic) (2)多邊形:簡單多邊形、凸多邊形、多邊形三角剖分;(advance) (3)凸殼及其應用;(advance) (4)Voronoi圖/三角剖分及其應用;(advance) (5)多邊形的交與並;(expert) (6)平面圖;(expert) 3、數值計算

(1)數值計算的三大任務:求值、解方程(組)、函數逼近;(basic) (2)數值計算的誤差、適定性、穩定性;(basic)

(3)解線性方程組直接方法:Gauss消元法、三角分解法;(basic)

(4)解線性方程組一般迭代方法:基本迭代、Jacobi迭代、G-S迭代、SOR/SSOR迭代; (advance)

(5)解線性方程組的變分迭代法:共軛梯度、預處理共軛梯度法;(expert) (6)解非線性方程組迭代方法:Newton迭代法、Newton-Raphson迭代法、同倫演算法; (expert)

(7)求解矩陣特徵值:乘冪法與反乘冪法、Rayleigh商迭代法、QR法、Krylov子空間 法;(expert)

(8)插值:多項式插值、樣條插值;(advance) (9)數值積分:Simpson公式、Gauss積分;(basic) (10)解常微分方程:歐拉法、Runge-Kutta法;(advance) (11)解橢圓方程:有限單元法、有限差分法、邊界元法;(expert)

希望可以幫到您,謝謝!

熱點內容
php開啟錯誤 發布:2025-07-14 01:16:49 瀏覽:998
esp資料庫 發布:2025-07-14 01:16:44 瀏覽:980
python查找文件路徑 發布:2025-07-14 01:16:03 瀏覽:514
phpapachetomcat 發布:2025-07-14 01:08:41 瀏覽:123
伺服器運維看什麼書 發布:2025-07-14 01:07:32 瀏覽:988
密碼器動態密碼怎麼弄 發布:2025-07-14 00:44:27 瀏覽:386
小米怎麼把視頻加密 發布:2025-07-14 00:42:59 瀏覽:406
在線申訴找回密碼根本什麼都沒有 發布:2025-07-14 00:41:22 瀏覽:306
拉新用什麼安卓手機可以 發布:2025-07-14 00:41:19 瀏覽:418
androidhome鍵退出 發布:2025-07-14 00:30:03 瀏覽:506