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年5月2日 星期五
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);
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日 星期二
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日 星期三
訂閱:
文章 (Atom)









