2014年5月2日 星期五

[C/C++] struct 和 union 的sizeof相關判斷方式

sizeof 相關整理
            32bit    64bit(LLP64)    64bit(LP64)
char         1        1                1            byte
short        2        2                2
int            4        4                4
pointer     4        8                8
long         4        4                8


struct 對齊的size判斷
1. #pragma pack(4) 超過最大成員型別的size以 最大成員型別的size 為區塊依據 (4 byte表示記憶體一次讀取4 byte)
2. 成員順序會影響struct的總大小
3. 一個成員不能拆開在不同區塊
4. 區塊空間足夠才可合併,例如char和short可合併在區塊大小為4 byte的空間
5. struct中的struct/union 須考慮子層的最大型別再對齊


union 對齊的size判斷
1. #pragma pack(4) 超過最大成員型別的size以 最大成員型別的size 為區塊依據 (4 byte表示記憶體一次讀取4 byte)
2. 以最大size的成員直接當成union的size (因空間共用)
3. 若最大size的成員型別(char)不是 成員當中型別最大的(int),則須對齊

PS. 若子層的struct/union沒有實體化只單純宣告 則不占空間, 反之有給定變數則要計算

// 例一
struct B   
{ 
    union A  // 不占空間
    { 
        int t;   //4 
        short m; //2 
        char p;  //1 
    } ;          // } AA; 若有給定名稱(實體化)則要計算
    double c;    //8 
    char p2;     //1 
}; 
// sizeof(B) = 8+8 = 16

// 例二
union A
{ 
    int t;   //4 
    short m; //2 
    char p;  //1 
} ; 
struct B   
{ 
    A a;    //4 有實體化
    double c;    //8 
    char p2;     //1 
};
// sizeof(B) = 8+8+8 = 24

2014年4月24日 星期四

[7] VS2008 如何為執行檔加入icon

1. 準備icon 可使用http://www.ifreesite.com/favicon/ 轉成桌面用較大的圖示
2. 添加資源檔 將轉好的icon匯入
3. 編譯 預設就會出現囉~

ps1.
這個只會出現在未執行時

ps2.
若要在程式執行時的視窗使用自己的圖示,請在寫代碼在程式中
以使用QT為例
QPixmap pixImg("..\\Resource\\img\\keyicon.png");
test_form->setIcon(pixImg);


2014年3月12日 星期三

[4] VS2008如何遠端偵錯

以DLL放置遠端電腦,使用本機程式讀取為例

[一] 在要放置DLL的電腦啟動遠端偵錯工具

[二] 工具->選項,設定驗證方式及port和可偵錯時間(可加長)

[三] 打開本機端的source code,打開專案屬性,確定停用最佳化,以及打開產生偵錯資訊


[四] 編譯產生DLL檔和符號檔(pdb)

[五] 將DLL放置遠端同目錄,供其他程式載入,將pdb放置與本機成是相同位置(好像可以不用放,VS會自己找)

[六] 使用 VS->工具->附加置處理序

[七] 選擇 遠端,輸入遠端的IP及之前設定的port,選擇載入此DLL的程序(此圖舉例),按附加

[八] 添加中斷點,執行本機端程式,即可偵錯

[PS]
若中斷點找不到符號?
1. 可能是code有更動,符號對不到,重新編譯,重放符號檔及DLL
2. DLL和pdb的放置位置不一樣
3. 最佳化未停用

2014年3月11日 星期二

[3] VS 如何忽略警告

[一] 忽略警告設定,可能是C的舊語法不安全造成

[2] VS如何不顯示console


[一] debug顯示console


[二] release顯示console

2013年12月18日 星期三

[C/C++] C++類別繼承筆記(1)

#include <iostream>

using namespace std;

class A
{
    public:
    A(string s)
    {
        cout<<"construct A:"<<s<<endl;
        a = s;
    }
    virtual void displayA() //=0 純虛擬不能實體化
    {
        cout<<"dispalyA"<<endl;
    }
    
    protected:
    string a;
};

class B:public A
{
    public:
    B():A("before B"){cout<<"construct B"<<endl;}
    
    void displayA()         //也是virtual 不需再加
    {
        cout<<"dispalyB"<<endl;
    }
    
    void dispalyB()
    {
        cout<<a<<endl;
    }
};
class C:public B
{
    void displayA()          //也是virtual 不需再加
    {
        cout<<"dispalyC"<<endl;
    }
};
int main()
{
   cout << "Hello World" << endl; 
   A ca("test");    //可實體化
   ca.displayA();
   A *pa;
   B cb;
   pa = &cb;
   pa->displayA();  //虛擬函式會往子class找有實作的
   return 0;
結果:
Hello World
construct A:test
dispalyA
construct A:before B
construct B
dispalyB  

2013年11月13日 星期三

[1] VS error LNK2005

[一] msvcprtd.lib(MSVCP90D.dll) :
設定C/C++ >> 程式碼產生 >> 執行階段程式庫

多執行緒偵錯 (/MTd) /MT /MD