c++概要總結,持續更新



一、  base data types(atom types)

from c++0x/c++2011standard.

typename

g++4.5-32bit

g++4.5-64bit

vc10.0-32bit

vc10.0-64bit

char

1

1

1

1

char16_t

2

2

2

2

char32_t

4

4

4

4

wchar_t

4

4

2

2

short

2

2

2

2

int

4

4

4

4

long

4

8

4

4

long long

8

8

8

8

float

4

4

4

4

double

8

8

8

8

long double

12

16

8

8

派生成員函數指針(單繼承)

8

16

4

8

派生成員函數指針(多繼承)

8

16

8

16

派生成員函數指針(虛繼承)

8

16

12

16

二、     definefunction

#ifdef __linux__

#define __stdcall __attribute__((__stdcall__))

#define __thiscall __attribute__((__thiscall__))

#define __cdecl __attribute__((__cdecl__))

#define __fastcall __attribute__(__fastcall__))

#endif

 

RetType call_convFuncName(ParamType param);

 

example: RecursiveCall

 

int __cdeclcalc_sum(int sum, inti)

{

if( 0 == i )

{

    return sum;

}

sum += i;

return calc_sum(sum, --i);

}

 

三、     control statement

if( cond1)

{

    statement1;

}

else if(cond2 )

{

    statement2;

}

else

{

    statement3;

}

 

四、     switch usage

switch(flg )

{

case 1:

   statement1;

    break;

case 2:

   statement2;

    break;

default:

   statement3;

}

 

五、     loopstatement

while(condition )

{

    statements;

}

 

do {

statements;

} while( condition );

 

for( ;condition; )

{

    statements;

}

 

loop:

statements;

if( condition )

{

    goto loop;

}

 

六、     pitfallsand knowledge

(1)thinking:

int i =1;

int j =(++i) + (i++) + (++i);

VC6.0/GNUgcc/g++: i = 4, j = 7

VS2005/2008/2010: i = 4, j = 9;

 

(2)thedifference of following statements:

char* lpszStr1 = "hello world";

const char* lpszStr2 = "helloworld";

char lpszStr3[] = "helloworld";

(3)thedifferent of pointer and reference

  int i=0;

  int& j=i;

  int* k=&i;// int* k=&j;

  ref,alias(the same entity) pointer,address(addressof entity)

  In fact, the implement of pointer and referenceby assembly is the same. Such as following:

    int i = 5;

    int* pi = &i;

    int ri = i;

  The corresponding assembly code:

mov dword [i], 5

lea eax, [i]

mov dword ptr[pi], eax;

lea eax, dword ptr[i]

mov dword ptr[ri], eax

(4) enumtype

  4 bytessigned in 32bit-program

 8 bytes signed in 64bit-program

(5) macro

  #define parse_to_string(macro_arg) #macro_arg

  #define contact(arg1, arg2) arg1##arg2

(6)templatespecialization in class.

 VisualStudio support explicit and implicit specialization

 GCC just support implicit specialization.

 

七、     c++0xstandard

vs2010 introduce:

1.lambda expression

genericsyntax:

[](ParaType para) ->RetType//->RetType: specific return type

{

    statements;

}

[] : lambdaexpr prefix

 

othersyntax:

(1)

int local= 0;

int result= [&](void) ->int

{

    return ++local;

}();

 

or

 

int result= [&local](void) ->int

{

    return ++local;

}();

 

(2)

int local= 0;

int result= [=](void) mutable ->int

{

    return ++local;

}();

 

or

 

int result= [local](void) mutable->int

{

    return ++local;

}();

 

2.static_assert

example:

template<typename _Ty, typename _Tx>

_Typointer_cast(_Tx sptr)

{

static_assert(std::tr1::is_pointer<_Tx>::value&&

                 std::tr1::is_pointer<_Ty>::value,

                 “the type of src and dstoperand must be pointer”);

union {

    _Txs_ptr;

    _Tyd_ptr;

} uData;

uData.s_ptr = sptr;

return uData.d_ptr;

}

 

3.support new means for keyword: auto, type deduction.

example:

auto i =3; // be similar to var in C#

 

4.rvalue, it can bind on a temporary.

example:

template<typename T>

class Integer

{

public:

Integer(void)

{

    this->data = T();

}

Integer(const T&data)

{

    this->data = data;

}

Integer(const Integer&integer)

{

   this->data = integer.data;

}

 

bool operator==(const Integer&integer)

{

    return this->data == integer.data;

}

bool operator==(const Integer&&integer)

{

    return *this == integer;

}

private:

    T data;

};

 

5.decltype usage:

auto i =1;

auto j =1.0f;

typedef decltype(j) JType;

 

gcc 4.5 ext support

6.new keywords: char16_t, char32_t

example:

char16_t f[]= u”hello world!”;

char32_t e[]= U”hello world!”;

 

 

八、     inlineasm usage

Win32vc6.0, 8.0, 9.0, 10.0

int a = 3, b = 0;

__asm moveax, a;

__asm movb, eax;

 

Linux32

int a =3, b = 0;

__asm__ [__volatile__](“movl %1, %0” : “=r”(b) : “m” (a));

or

asm [volatile](“movl%1, %0” : “=r”(b) : “m”(a));

 

 

example:

template<typename bchar>

__declspec(naked)

    int __cdecl _strlen(const bchar*)

{

    __asm

    {

       movesi, dword ptr[esp + 4];

       moveax, -1;

       cmpesi, 0;

       jzend__;

label:

       movcl, byte ptr [esi];

       incesi;

       inceax;

       cmpcl, 0;

       jnzlabel;

end__:

       ret;

    }

}

 

template<typename wchar>

__declspec(naked)

    int __cdecl _wcslen(const wchar*)

{

    __asm

    {

       movesi, dword ptr[esp + 4];

       moveax, -1;

       cmpesi, 0;

       jzend;

label:

       movcx, word ptr [esi];

       incesi;

       inceax;

       cmpcx, 0;

       jnzlabel;

end:

       ret;

    }

}

 

template<typename bchar>

__declspec(naked)

    char* __cdecl_strcpy(bchar*, const bchar*, int)

{

    __asm

    {

       movecx, dword ptr[esp + 12] 

       movesi, dword ptr[esp + 8];

       movedi, dword ptr[esp + 4];

       incecx;

       repmovsb;

       moveax, edi;

       subeax, dword ptr[esp + 12];

       deceax;

       ret;

    }

}

 

template<typename wchar>

__declspec(naked)

    wchar_t* __cdecl_wcscpy(wchar*, const wchar*, int)

{

    __asm

    {

       movecx, dword ptr[esp + 12] 

       movesi, dword ptr[esp + 8];

       movedi, dword ptr[esp + 4];

       incecx;

       repmovsw;

       moveax, edi;

       subeax, dword ptr[esp + 12];

       subeax, dword ptr[esp + 12];

       subeax, 2;

       ret;

    }

}

 

template<typename bchar>

__declspec(naked)

    char* __cdecl_strcat(bchar*, int, constbchar*, int)

{

    __asm

    {

       movecx, dword ptr[esp + 16];

       movesi, dword ptr[esp + 12];

       movedx, dword ptr[esp + 8];

       movedi, dword ptr[esp + 4];

       addedi, edx;

       repmovsb;

       movbyte ptr[edi], 0;

       moveax, edi;

       subeax, dword ptr[esp + 16];

       subeax, edx;

       ret;

    }

}

 

template<typename wchar>

__declspec(naked)

    wchar_t* __cdecl_wcscat(wchar*, int, constwchar*, int)

{

    __asm

    {

       movecx, dword ptr[esp + 16];

       movesi, dword ptr[esp + 12];

       movedx, dword ptr[esp + 8];

       addedx, dword ptr[esp + 8];

       movedi, dword ptr[esp + 4];

       addedi, edx;

       repmovsw;

       movword ptr[edi], 0;

       moveax, edi;

       subeax, dword ptr[esp + 16];

       subeax, dword ptr[esp + 16];

       subeax, edx;

       ret;

    }

}

 

 

發佈了41 篇原創文章 · 獲贊 35 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章