空類編譯器做了哪些操作
『壹』 C++中的空類編譯器默認隱式聲明哪些成員函數
如果你只是聲明一個空類,不做任何事情的話,
編譯器會自動為你生成四個函數:
一個默認構造函數、
一個拷貝默認構造函數、
一個默認拷貝賦值操作符
一個默認析構函數
『貳』 java編譯器的功能是什麼編譯過程中主要完成哪些操作
主要是把.java文件編譯成.class文件,在編譯的過程中,初始化static成員,
『叄』 請問拋磚:VS的編譯器到底做了什麼
最近在學習並發程序設計,其中有個很重要的概念叫原子操作。網上有很多文章論述原子操作的,其中大部分文章不約而同的都使用到了這個例子++操作,來例證很多高級語言中的一條語句並非是不可拆分的原子操作。出於好奇,本人對++操作的原子性在VS2012下寫了一個小程序以測試之,於是乎發現了下面的問題。//測試代碼TEST(ConcurrenceTest, Atomic){ std::vector
<std::thread
threads; threads.push_back(std::thread(std::ref(thread))); threads.push_back(std::thread(std::ref(thread)));for(auto &
t : threads) { t.join(); } std::cout<<"total值:"<<total<<
std::endl;}//線程voidthread(){for(inti =0; i <50000; i++) { total++; }}以上代碼在release下結果都是100000,但在debug下會小於100000。
了解原子操作的朋友應該知道,debug下小於100000的結果應該屬正常現象,因為++操作並不具有原子性,所有在並發的過程中會出現數據競跑的現象。但是在release下所得到的結果卻總是正確的(為了避免偶然性,本人用更多的線程,更大的數據類型同樣做過測試,結果依然正確),這不得不懷疑編譯器在release下對代碼是否做過一定的優化? 那麼這種優化對於程序員來說是一件好事么? 他會不會給一些對此了解不深的程序員造成一種正確的假象?本人是個初學者,寫這些的目的只是拋個磚,以上的觀點也僅是本人的一些小想法,希望有興趣的朋友能來一起討論。
『肆』 初學C語言用TC/VC迷糊中。教材哪裡找
初學用TC就可以 上手容易教材資料豐富 稍微入行點就換VC6.0+Visual.Assist.X插件
『伍』 編譯器做什麼工作
1. 詞法分析 詞法分析器根據詞法規則識別出源程序中的各個記號(token),每個記號代表一類單詞(lexeme)。源程序中常見的記號可以歸為幾大類:關鍵字、標識符、字面量和特殊符號。詞法分析器的輸入是源程序,輸出是識別的記號流。詞法分析器的任務是把源文件的字元流轉換成記號流。本質上它查看連續的字元然後把它們識別為「單詞」。 2. 語法分析 語法分析器根據語法規則識別出記號流中的結構(短語、句子),並構造一棵能夠正確反映該結構的語法樹。 3. 語義分析 語義分析器根據語義規則對語法樹中的語法單元進行靜態語義檢查,如果類型檢查和轉換等,其目的在於保證語法正確的結構在語義上也是合法的。 4. 中間代碼生成 中間代碼生成器根據語義分析器的輸出生成中間代碼。中間代碼可以有若干種形式,它們的共同特徵是與具體機器無關。最常用的一種中間代碼是三地址碼,它的一種實現方式是四元式。三地址碼的優點是便於閱讀、便於優化。 5. 中間代碼優化 優化是編譯器的一個重要組成部分,由於編譯器將源程序翻譯成中間代碼的工作是機械的、按固定模式進行的,因此,生成的中間代碼往往在時間和空間上有很大浪費。當需要生成高效目標代碼時,就必須進行優化。 6. 目標代碼生成 目標代碼生成是編譯器的最後一個階段。在生成目標代碼時要考慮以下幾個問題:計算機的系統結構、指令系統、寄存器的分配以及內存的組織等。編譯器生成的目標程序代碼可以有多種形式:匯編語言、可重定位二進制代碼、內存形式。 7 符號表管理 符號表的作用是記錄源程序中符號的必要信息,並加以合理組織,從而在編譯器的各個階段能對它們進行快速、准確的查找和操作。符號表中的某些內容甚至要保留到程序的運行階段。 8 出錯處理用戶編寫的源程序中往往會有一些錯誤,可分為靜態錯誤和動態錯誤兩類。所謂動態錯誤,是指源程序中的邏輯錯誤,它們發生在程序運行的時候,也被稱作動態語義錯誤,如變數取值為零時作為除數,數組元素引用時下標出界等。靜態錯誤又可分為語法錯誤和靜態語義錯誤。語法錯誤是指有關語言結構上的錯誤,如單詞拼寫錯、表達式中缺少操作數、begin和end不匹配等。靜態語義錯誤是指分析源程序時可以發現的語言意義上的錯誤,如加法的兩個操作數中一個是整型變數名,而另一個是數組名等。
『陸』 誰知道C++編譯器會為類添加哪些成員函數
條款45: 弄清C++在幕後為你所寫、所調用的函數
一個空類什麼時候不是空類?當C++編譯器通過它的時候。如果你沒有聲明下列函數,體貼的編譯器會聲明它自己的版本。這些函數是:一個拷貝構造函數,一個賦值運算符,一個析構函數,一對取址運算符。另外,如果你沒有聲明任何構造函數,它也將為你聲明一個預設構造函數。所有這些函數都是公有的。換句話說,如果你這么寫:classEmpty{};和你這么寫是一樣的:classEmpty{public:Empty();// 預設構造函數Empty(constEmpty& rhs);
// 拷貝構造函數~Empty();// 析構函數Empty&operator=(constEmpty& rhs);
// 賦值運算符Empty*operator&();// 取址運算符constEmpty*operator&()const;};對於這個問題,好像早有讀者向書的作者Scott Meyers提出了疑問,Scott Meyers也認為上邊的答案是有問題的.正確的結果應該是:classEmpty{public:Empty();Empty(constEmpty&);
~Empty();
Empty&operator=(constEmpty& rhs);}另外,需要注意的是只有當你需要用到這些函數的時候,編譯器才會去定義它們。
聲明一個空類,大家都認為會生成
構造函數、拷貝構造函數、析構函數、賦值運算符號;
其實對於這樣的一個空類來說,是完全沒有必要的,而編譯器也不是這樣做的。是我們太低估編譯器給我們做的工作了,我們用VC編譯器來說明一下。
classA{};對於單獨申明的一個空類A來說,編譯器編譯過程中,並沒有發現創建A實例。所以對於空類A來說,編譯器是不會給類A生成任何函數的;如果我們在代碼中需要生成一個A的實例,比如A a;編譯器就會根據上面的實例,給類A生成構造函數和析構函數。 當使用A b(b);編譯器就會生成類A的拷貝構造函數;A c;c = a;編譯器生成賦值運算符函數;
A &d = a;
編譯器生成取地址運算符函數。
經過分析可以這樣理解:
對於一個沒有實例化的空類,編譯器是不會給它生成任何函數的,當實例化一個空類後,編譯器會根據需要生成相應的函數。這條理論同樣適合非空類(只聲明變數,而不聲明函數)。
『柒』 C++中的空類,編譯器默認可以產生哪些成員函
6個成員函數都會默認產生 然後編譯過程中根據需求再去實例化
『捌』 C++中編譯時遇到函數的定義,編譯器做了哪些事,
程序在內存中分為四部分
代碼段 (程序代碼,比如你的函數)
靜態段 (存放靜態變數和全局變數,還有用到的字面值常量)
堆 (由程序員自己管理的內存,動態分配用的就是這部分內存) //動態分配的數組在這里
棧 (由操作系統管理,局部變數和臨時變數存在這里) //自己定義的數組在這里
現在你應該知道自己定義的普通數組在哪裡,動態分配的數組又在哪裡了吧.
調用函數時都是值傳遞,就是把變數的值復制一份給函數這時就會新分配一塊內存給函數中
接收這個值的那個變數,當函數結束時,這個變數被釋放
引用調用不是值傳遞,而是讓函數直接操作你傳遞的實參
高級一點: 引用其實也是值傳遞這種方式,只不過編譯器偷偷給你變成了指針
『玖』 C++中的空類,編譯器默認可以產生哪些成員函數
一個空的class在C++編譯器處理過後就不再為空,編譯器會自動地為我們聲明一些member function,如果你寫
class Empty{};
就相當於:
class Empty
{
public:
Empty();
Empty(const Empty&);
~Empty();
Empty& operator=(const Empty& rhs);
Empty* operator&();
const Empty* operator&() const;
};
需要注意的是只有當你需要用到這些函數的時候,編譯器才會去定義它們。
『拾』 C語言里一個變數給另一個變數賦值時編譯器進行了哪些操作
把a所佔據的內存空間拷貝一份復制到b所佔據的空間。
看上去就像執行了b.a= a.a, b.b = a.b, b.c = a.c;