Time of Update: 2018-12-08
c++中的來源程式:複製代碼 代碼如下:class X {private: int i;};int main() { X x;}上面的類X沒有定義建構函式,僅僅有一個int i。下面為其組譯工具:複製代碼 代碼如下:; 7 : int main() { push ebp;ebp為一個寄存器,總是指向一個函數呼叫堆疊的棧底,作為基址,用位移量來訪問該調用棧上的變數,但這裡沒有任何變數要訪問,因此不起作用 mov ebp,
Time of Update: 2018-12-08
C語言前置處理器執行宏替換、條件編譯和檔案包含。通常採用以“#”為行首的提示。下面是C語言預先處理的應用場合: 1.三字母詞(Trigraph Sequences) C來源程式的字元集被包含在7位的ASCII字元集中,但是它是ISO 646-1983 Invariant Code Set的超集。為了讓程式可以在縮減集(reduced set)中呈現出來,下面的三字母詞會被替換成相應的單字元.三字母詞單字元??=#??/\??'^??([??)]??!|??<{??>}??-~
Time of Update: 2018-12-08
在進行memcpy操作時,雖然是記憶體操作,但是仍然是耗一點點CPU的,今天測試了一下單線程中執行memcpy的效率,這個結果對於配置TCP epoll中的work thread數量有指導意義。如下基於8K的記憶體快執行memcpy, 1個線程大約1S能夠拷貝500M,如果伺服器頻寬或網卡到上限是1G,那麼網路io的work thread 開2個即可,考慮到訊息的解析損耗,3個線程足以抗住硬體的最高負載。在我到測試機器上到測試結果是:Intel(R) Xeon(R) CPU
Time of Update: 2018-12-08
首先簡單說一下什麼是行壓縮圖,其實嚴格意義上應該是行壓縮矩陣。正常情況下,矩陣是用二維數組簡單儲存的,但是如果是疏鬆陣列,也就是零很多的時候,這樣比較浪費空間。所以就有各種節省空間的儲存方式,三元組儲存就是其中一種。什麼是三元組呢?一個三元組就是(row,col,value),這樣把所有不為零的值組成一個向量。這種儲存方式比二維數組節省了不少空間,當然還可以進一步節省,因為三元組裡面row或者col重複儲存了,一行或者一列存一次就行了,按這種思路走下去就是行壓縮儲存了。那具體什麼是行壓縮儲存呢?
Time of Update: 2018-12-08
如何計算矩陣乘法,這個大家都知道。通常情況下,我們都是用以下代碼實現的:複製代碼 代碼如下:for(i=0;i<n;++i) for(j=0;j<n;++j){ sum=0; for(k=0;k<n;++k) sum+=A[i][k]*B[k][j]; C[i][j]+=sum;}但是考慮了快取的問題後,其實有一種更好的實現方式:複製代碼 代碼如下:for(i=0;i<n;++i) for(k=0
Time of Update: 2018-12-08
首先看一個例子:複製代碼 代碼如下:#include <iostream> using namespace std; class A{}; class B { int b; char c; }; class C { int c1; static int c2; }; int C::c2 = 1; class D:public C,public B{ int d; }; int main() {
Time of Update: 2018-12-08
有了之前的基礎,此文只是把一些以前沒有注意到的和值得學習的知識做一個記錄。第一章 作者認為使用#if 0 .... #endif比用/*和*/好,因為後者不能嵌套。但是對於//並沒有說明。第二章 三字母詞,用兩個問號加一個符號表示另一個符號,比較類似於逸出字元。查閱了一些資料,它的使用與編譯器有關,瞭解即可,防止字串常量被錯誤的解釋。複製代碼 代碼如下:??( ==> [ ??< ==> { ??= ==> # ??) ==> ]
Time of Update: 2018-12-08
複製代碼 代碼如下:static string GetStr(string s = "a", int i = 10, string r = "rrrr") { return s + i + r; }調用時,可以用如下幾種方法調用複製代碼 代碼如下: GetStr(); GetStr("abcde"); GetStr("abcde", 100);
Time of Update: 2018-12-08
一、輸入緩衝 在介紹如何進行詞法分析之前,先來說說一個不怎麼被提及的問題——怎麼從源檔案中讀取字元流。為什麼這個問題這麼重要呢?是因為在詞法分析中,對字元流是有要求的,它必須能夠支援後援動作(就是將多個字元放回到流中,以後會再次被讀取)。先來解釋下為什麼需要支援後援動作,舉個簡單的例子來說,現在要對兩個模式進行匹配:圖 1 流的回退過程上面是一個簡單的匹配過程,僅為了展示回退過程,在後面實現 DFA 模擬器時會詳細解釋是如何匹配詞素的。現在來看看 C# 中與輸入相關的類,有
Time of Update: 2018-12-08
雖然文章的標題是詞法分析,但首先還是要從編譯原理說開來。編譯原理應該很多人都聽說過,雖然不一定會有多麼瞭解。簡單的說,編譯原理就是研究如何進行編譯——也就如何從代碼(*.cs 檔案)轉換為電腦可以執行的程式(*.exe 檔)。當然也有些語言如 JavaScript 是解釋執行的,它的代碼是直接被執行的,不需要產生可執行程式。編譯過程是很複雜的,它涉及到很多步驟,直接拿《編譯原理》(Compilers: Principles, Techniques and Tools,紅龍書)上的圖來看:圖 1
Time of Update: 2018-12-08
1、複製代碼 代碼如下:const char *str = "test測試test";while(*str){//這裡只需要判斷第一個位元組大於0x80就行了,前提是輸入的是合法的GBK字串//原因在於,如果第一個位元組大於0x80,那麼它必然和後面一個位元組一起組成一個漢字//所以就沒有必要再去判斷後面一個位元組了//再強調一下,前提條件是輸入合法的GBK字串if(*str > 0x80){// 漢字,計數器++str += 2;//是漢字自然就該直接+2了}else{str++;}}2
Time of Update: 2018-12-08
常用的位元運算主要有與(&), 或(|)和非(~), 比如:1 & 0 = 0, 1 | 0 = 1, ~1 = 0在設計許可權時, 我們可以把許可權管理操作轉換為C#位元運算來處理.第一步, 先建立一個枚舉表示所有的許可權管理操作:複製代碼 代碼如下:[Flags] public enum Permissions { Insert = 1, Delete = 2, Update = 4, Query = 8 } [Flags]表示該枚舉可以支援C#位元運算, 而枚舉的每一項值,
Time of Update: 2018-12-08
首先,當考慮到記憶體配置和執行效能的時候,使用std::deque要比std::vector好。Deque總覽deque和vector一樣都是標準模板庫中的內容,deque是雙端隊列,在介面上和vector非常相似,在許多操作的地方可以直接替換。假如讀者已經能夠有效地使用vector容器,下面提供deque的成員函數和操作,進行對比參考。函數描述c.assign(beg,end)c.assign(n,elem) 將[beg; end)區間中的資料賦值給c。將n個elem的拷貝賦值給c。c.at(
Time of Update: 2018-12-08
有了上一節中得到的Regex,那麼就可以用來構造 NFA 了。NFA 可以很容易的從Regex轉換而來,也有助於理解Regex表示的模式。一、NFA 的表示方法 在這裡,一個 NFA 至少具有兩個狀態:首狀態和尾狀態, 1 所示,Regex $t$ 對應的 NFA 是 N(t),它的首狀態是 $H$,尾狀態是 $T$。圖中僅僅畫出了首尾兩個狀態,其它的狀態和狀態間的轉移都沒有表示出來,這是因為在下面介紹的遞迴演算法中,僅需要知道 NFA 的首尾狀態,其它的資訊並不需要關心。圖 1 NFA
Time of Update: 2018-12-08
區別C++中對於類來說,對於其中的成員,用點操作符.來獲得,而對於一個指向類對象的指標來說,則用箭頭操作符->調用該指標所指向對象的成員。當類定義->重載操作符後,則既可以用箭頭操作符,也可以用點操作符。重載->操作符重載箭頭操作符必須定義為類成員函數。沒有顯式形參(而且是類成員,唯一隱式形參是this)。->的右運算元不是運算式,而是對應類成員的一個標識符,由編譯器處理擷取成員工作。重載箭頭操作符必須返回指向類類型的指標,或者返回定義了自己的箭頭操作符的類類型對象。如果
Time of Update: 2018-12-08
//Main複製代碼 代碼如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Fibonacci{ class Program { static void Main(string[] args) { Console.WriteLine("Would you like to know which
Time of Update: 2018-12-08
Regex是一種描述詞素的重要表示方法。雖然Regex並不能表達出所有可能的模式(例如“由等數量的 a 和 b 組成的字串”),但是它可以非常高效的描述處理詞法單元時要用到的模式類型。一、Regex的定義Regex可以由較小的Regex按照規則遞迴地構建。每個Regex r 表示一個語言 L(r) ,而語言可以認為是一個字串的集合。Regex有以下兩個基本要素:1.ϵ 是一個Regex, L(ϵ)=ϵ ,即該語言只包含空串(長度為 0 的字串)。2.如果 a 是一個字元,那麼 a
Time of Update: 2018-12-08
通常C#使用基於XML的設定檔,不過如果有需要的話,比如要兼顧較老的系統,可能還是要用到INI檔案。但C#本身並不具備讀寫INI檔案的API,只有通過調用Unmanaged 程式碼的方式,即系統自身的API才能達到所需的目的。對應讀寫的方法分別為GetPrivateProfileString和WritePrivateProfileString。GetPrivateProfileString中的各參數:lpAppName —— section的名稱lpKeyName ——
Time of Update: 2018-12-08
整數轉換為字串:char *itoa( int value, char *string,int radix);小數轉換為字串:sprintf(串, 格式控制符列, 資料);字串轉小數:double atof(const char *nptr);字串轉整數:int atoi(const char *nptr);測試代碼:複製代碼 代碼如下:#include<stdio.h> #include<stdlib.h> int main() { int a=2013420
Time of Update: 2018-12-08
該雜湊演算法為一個檔案產生一個小的二進位“指紋”,從統計學的角度來看,不同的檔案不可能產生相同的雜湊碼要產生一個雜湊碼,必須首先建立一個HashAlgorithm對象,通過HashAlgorithm.Create方法來完成。然後調用HashAlgorithm.ComputeHash方法,它會返回一個儲存雜湊碼的位元組數組,再使用BitConverter.Tostring()將其裝換為字串進行比較。源碼如下:複製代碼 代碼如下:public static bool