VS2005 沒有找到MSVCR80D.dll的完美解決方案
方法1. “工程屬性->配置屬性->清單工具->常規->FAT32解決辦法”,選“是”;
方法2. 找到工程Debug目錄下的.rec檔案,刪掉(或刪掉整個Debug目錄)重新編譯;
方法3. http://www.cnblogs.com/qianinsun/archive/2006/12/01/579182.html
位元組對齊
#program pack(x) //x=1,2,4,8,16...預設為8
每當一個結構的成員變數要定位時,取該成員變數的長度與x中間的最小值作為標準,該成員變數的位移量(offset)必須能夠被該值整除。當所有的成員都定位完成後,再次取該結構體中最寬成員的長度與x中間的最小值作為標準,整個結構體的大小必須能夠被該值整除。
.NET環境編程tip
任何.NET環境下編寫的程式都需要安裝.NET架構才能運行(注意預設情況下C++語言編寫的程式不需要.NET架構的CLR即運行,通過制定一個新的開關,C++編譯器也能夠產生出需要CLR才能執行的託管模組),我們可以通過再%windir%/system32目錄下尋找MSCorEE.dll檔案來判斷該機器是否安裝了.NET架構。如果存在則證明已安裝。如果想確定安裝了哪些版本的.NET架構,可以查看如下註冊表鍵下的子鍵:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/policy
C VS .NET
C語言運行時堆分配記憶體基於鏈表,.NET CLR託管堆分配則基於連續的記憶體塊,故.NET指派至要比C快得多;
.NET在記憶體回收後要用到memcpy函數壓縮託管堆,所以會給應用程式帶來不小的效能損傷,其效能比C運行時的堆的效能低。
指標的強制類型轉換
在指標的強制類型轉換:ptr1=(TYPE*)ptr2中,如果sizeof(ptr2的類型)大於sizeof(ptr1的類型),那麼在使用指標ptr1來訪問ptr2所指向的儲存區時是安全的。如果sizeof(ptr2的類型)小於sizeof(ptr1的類型),那麼在使用指標ptr1 來訪問ptr2所指向的儲存區時是不安全的。
Win32平台下的微軟C編譯器(cl.exe for 80x86)在預設情況下採用如下的對齊規則
任何基礎資料型別 (Elementary Data Type)T的對齊模數就是T的大小,即sizeof(T)。比如對於double類型(8位元組),就要求該類型資料的地址總是8的倍數,而char類型資料(1位元組)則可以從任何一個地址開始。Linux下的GCC奉行的是另外一套規則(在資料中查得,並未驗證,如錯誤請指正):任何2位元組大小(包括單位元組嗎?)的資料類型(比如short)的對齊模數是2,而其它所有超過2位元組的資料類型(比如long,double)都以4為對齊模數。
"精確制導"
通過關閉一個局部範圍(比如一對花括弧"{}"),你可以精確控制變數的解構函式何時調用。
抽象類別
抽象類別是不能定義對象的,在實際中為了強調一個類是抽象類別,可將該類的建構函式說明為保護的存取控制許可權。
抽象類別只能作為基類來使用,其純虛函數的實現由衍生類別給出。如果衍生類別沒有重新定義純虛函數,而衍生類別只是繼承基類的純虛函數,則這個衍生類別仍然還是一個抽象類別。如果衍生類別中給出了基類純虛函數的實現,則該衍生類別就不再是抽象類別了,它是一個可以建立對象的具體類了。
類非內建類型成員的初始化
類非內建類型(如string類型)成員的初始化採用(1)形式比採用形式(2)可以獲得大概30%的效率提升;
形式(1):
Employee::Employee(const String& nm) : name(nm) { }
形式(2):
Employee::Emplogyee(const String& nm) { name = nm; }
形式(2)會對name成員進行兩次關於string的操作(一次初始化一次賦值)。
...
當兩個運算元都是操作的輸入,並且沒有一個會受到操作的影響,那麼我們最好將改操作符定義為一個非成員函數。這樣可以確保在有隱式轉換的條件下,這兩個運算元都可以以同樣的方式來進行操作。
...
將一個未命名的臨時對象作為一個非常量指標傳遞給以常量作為參數的函數是非法的。
...
如果基類中的解構函式不是虛擬,那麼通過一個指標來進行的刪除動作將不能調用到正確的那個衍生類別中的解構函式。
宏字元#
#是一個字串化操作符,將宏的參數轉換為字串常量。
Visual Studio快速鍵
Crtl+J 輸入補全
Crtl+K, Crtl+I 呼出相關資訊提示
Crtl+K, Crtl+P 呼出參數資訊
Shift+Alt+o 尋找檔案(AssistX?)
Crtl+I 快速尋找
Crtl+Shift+V 呼出最近20條剪貼簿記錄
Crtl+W 選定游標所處單詞
Ctrl+M, Ctrl+M 摺疊代碼
Crlt+M, Ctrl+L 摺疊該檔案所有代碼
Crtl+L 剪下行
Ctrl+Shift+L 刪除行
Alt+G 跳至函數定義/上一個和下一個游標位置切換
VC從硬碟載入一張位元影像的方法:
HBITMAP hBmp;
CBitmap Bitmap;
hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), "./res/bv.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
Bitmap.DeleteObject();
if(!Bitmap.Attach(hBmp))
{
AfxMessageBox("Error to attach a Bitmap");
}
ASCII特殊字元
數值 8、9、10 和 13 可以分別轉換為退格符、定位字元、分行符號和斷行符號符。這些字元都沒有圖形表示,但是對於不同的應用程式,這些字元可能會影響文本的顯示效果。
可程式化記憶體類型
可程式化記憶體在基本上分為這樣的幾大部分:靜態儲存區、堆區和棧區。他們的功能不同,對他們使用方式也就不同。
靜態儲存區:記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個運行期間都存在。它主要存放待用資料、全域資料和常量。
棧區:在執行函數時,函數內局部變數的儲存單元都可以在棧上建立,函數執行結束時這些儲存單元自動被釋放。棧記憶體配置運算內建於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
堆區:亦稱動態記憶體分配。程式在啟動並執行時候用malloc或new申請任意大小的記憶體,程式員自己負責在適當的時候用free或delete釋放記憶體。動態記憶體的生存期可以由我們決定,如果我們不釋放記憶體,程式將在最後才釋放掉動態記憶體。 但是,良好的編程習慣是:如果某動態記憶體不再使用,需要將其釋放掉,否則,我們認為發生了記憶體流失現象。
對於堆區、棧區和靜態儲存區它們之間最大的不同在於,棧的生命週期很短暫。但是堆區和靜態儲存區的生命週期相當於與程式的生命同時存在(如果您不在程式運行中間將堆記憶體delete的話),我們將這種變數或資料成為全域變數或資料。
VS中使用先行編譯檔案
1. 在工程層級設定先行編譯檔案的名稱,並且設定先行編譯標頭檔的名稱(如stdafx.h),並設定工程Yu(“使用”)標記;
2. 在檔案層級(如stdafx.cpp)設定由該檔案產生先行編譯頭,設定該檔案Yc(“產生”)標記即可;
3. 要產生先行編譯頭xxx.pch只要選擇上述檔案(stdafx.cpp),單獨編譯就可以了。
using namespace範圍
哪個檔案寫了using namespace std,那個檔案就引入了這個名字空間,跟其他檔案沒關係。
安裝vs2003常見問題
1. 安裝時讀寫註冊表過不去
在註冊表中刪除HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/pendingfilerenameoperations即可;
2. 安裝後出現讀取Accessibility錯誤
複製:C:/WINDOWS/Microsoft.NET/Framework/v1.1.4322/Accessibility.dll到:C:/Program Files/Microsoft Visual Studio .NET 2003/Common7/IDE/解決問題;
或者重新安裝 Microsoft.NET Framework;
fopen二進位("b")和文本方式("t")的區別
二進位方式很簡單,讀檔案時,會原封不動的讀出檔案的全部內容,寫的時候,也是把內存緩衝區的內容原封不動的寫到檔案中。
文本方式就不一樣了,在寫檔案時,會將分行符號號CRLF(0x0D 0x0A)全部轉換成單個的0x0A,並且當遇到結束符CTRLZ(0x1A)時,就認為檔案已經結束。相應的,寫檔案時,會將所有的0x0A換成0x0D0x0A。