最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++ 中__declspec 的用法詳解

 更新時間:2016年11月08日 14:11:22   作者:ylclass  
這篇文章主要介紹了c++ 中__declspec 的用法詳解,對初學(xué)者有一定的幫助,有需要的可以了解一下。

c++ 中__declspec 的用法如下,想要了解的繼續(xù)往下看吧。

語法說明:

__declspec ( extended-decl-modifier-seq )

擴展修飾符:

1:align(#)

用__declspec(align(#))精確控制用戶自定數(shù)據(jù)的對齊方式 ,#是對齊值。

e.g

__declspec(align(32)) 
struct Str1{
int a, b, c, d, e;
};

它與#pragma pack()是一對兄弟,前者規(guī)定了對齊的最小值,后者規(guī)定了對齊的最大值。同時出現(xiàn)時,前者優(yōu)先級高。

__declspec(align())的一個特點是,它僅僅規(guī)定了數(shù)據(jù)對齊的位置,而沒有規(guī)定數(shù)據(jù)實際占用的內(nèi)存長度,當指定的數(shù)據(jù)被放置在確定的位置之后,其后的數(shù)據(jù)填充仍然是按照#pragma pack規(guī)定的方式填充的,這時候類/結(jié)構(gòu)的實際大小和內(nèi)存格局的規(guī)則是這樣的:在__declspec(align())之前,數(shù)據(jù)按照#pragma pack規(guī)定的方式填充,如前所述。

當遇到__declspec(align())的時候,首先尋找距離當前偏移向后最近的對齊點(滿足對齊長度為max(數(shù)據(jù)自身長度,指定值)),然后把被指定的數(shù)據(jù)類型從這個點開始填充,其后的數(shù)據(jù)類型從它的后面開始,仍然按照#pragma pack填充,直到遇到下一個__declspec(align())。當所有數(shù)據(jù)填充完畢,把結(jié)構(gòu)的整體對齊數(shù)值和__declspec(align())規(guī)定的值做比較,取其中較大的作為整個結(jié)構(gòu)的對齊長度。特別的,當__declspec(align())指定的數(shù)值比對應(yīng)類型長度小的時候,這個指定不起作用。

2: allocate("segname")

用__declspec(allocate("segname")) 聲明一個已經(jīng)分配了數(shù)據(jù)段的一個數(shù)據(jù)項。它和#pragma 的code_seg, const_seg, data_seg,section,init_seg配合使用,segname必須有這些東東聲明。

e.g

#pragma data_seg("share_data")
int a = 0;
int b;
#pragma data_seg() __declspec(allocate("share_data")) int c = 1;
__declspec(allocate("share_data")) int d;

3. deprecated 

用__declspec(deprecated ) 說明一個函數(shù),類型,或別的標識符在新的版本或未來版本中不再支持,你不應(yīng)該用這個函數(shù)或類型。它和#pragma deprecated作用一樣。

e.g

#define MY_TEXT "function is deprecated"
void func1(void) {}
__declspec(deprecated) void func1(int) { printf("func1n");}
__declspec(deprecated("** this is a deprecated function **")) void func2(int) { printf("func2n");}
__declspec(deprecated(MY_TEXT)) void func3(int) { printf("func3");} 
int main()
{ 
fun1(); 
fun2(); 
fun3();
}

4.dllimport 和dllexport

用__declspec(dllexport),__declspec(dllimport)顯式的定義dll接口給調(diào)用它的exe或dll文件,用 dllexport定義的函數(shù)不再需要(.def)文件聲明這些函數(shù)接口了。注意:若在dll中定義了模板類那它已經(jīng)隱式的進行了這兩種聲明,我們只需在 調(diào)用的時候?qū)嵗纯?,呵呵?/p>

e.g 常規(guī)方式dll中

class ___declspec(dllexport) 
testdll{ 
testdll(){}; 
~testdll(){};
};

調(diào)用客戶端中聲明
#import comment(lib, "**.lib)
class ___declspec(dllimportt) 
testdll{ 
testdll(){}; 
~testdll(){};
}; 

e.g 模板類:dll中

template<class t>
class test{
test(){};
~test(){};
}
調(diào)用客戶端中聲明
int main()
{
test< int > b;
return 0;
} 

5. jitintrinsic

用__declspec(jitintrinsic)標記一個函數(shù)或元素為64位公共語言運行時。具體用法未見到。

6. __declspec( naked ) 

對于沒有用naked聲明的函數(shù)一般編譯器都會產(chǎn)生保存現(xiàn)場(進入函數(shù)時編譯器會產(chǎn)生代碼來保存ESI,EDI,EBX,EBP寄存器 ——prolog)和清除現(xiàn)場(退出函數(shù)時則產(chǎn)生代碼恢復(fù)這些寄存器的內(nèi)容——epilog) 代碼,而對于用naked聲明的函數(shù)一般不會產(chǎn)生這些代碼,這個屬性對于寫設(shè)備驅(qū)動程序非常有用,我們自己可以寫這樣一個過程,它僅支持x86 。naked只對函數(shù)有效,而對類型定義無效。對于一個標志了naked的函數(shù)不能產(chǎn)生一個內(nèi)聯(lián)函數(shù)即時使用了__forceinline 關(guān)鍵字。

e.g

__declspec ( naked ) func()
{
int i;
int j;
__asm /* prolog */
{
push ebp
mov ebp, esp
sub esp, __LOCAL_SIZE
}
/* Function body */
__asm /* epilog */
{
mov esp, ebp
pop ebp
ret
}
} 

7. restrict 和 noalias

__declspec(restrict) 和 __declspec(noalias)用于提高程序性能,優(yōu)化程序。這兩個關(guān)鍵字都僅用于函數(shù),restrict針對于函數(shù)返回指針,restrict 說明函數(shù)返回值沒有被別名化,返回的指針是唯一的,沒有被別的函數(shù)指針別名花,也就是說返回指針還沒有被用過是唯一的。編譯器一般會去檢查指針是否可用和 是否被別名化,是否已經(jīng)在使用,使用了這個關(guān)鍵字,編譯器就不在去檢查這些信息了。noalias 意味著函數(shù)調(diào)用不能修改或引用可見的全局狀態(tài)并且僅僅修改指針參數(shù)直接指向的內(nèi)存。如果一個函數(shù)指定了noalias關(guān)鍵字,優(yōu)化器認為除參數(shù)自生之外, 僅僅參數(shù)指針第一級間接是被引用或修改在函數(shù)內(nèi)部??梢娙譅顟B(tài)是指沒有定義或引用在編碼范圍外的全部數(shù)據(jù)集,它們的直至不可以取得。編碼范圍是指所有源 文件或單個源文件。其實這兩個關(guān)鍵字就是給編譯器了一種保證,編譯器信任他就不在進行一些檢查操作了。

e.g

#include <stdio.h>
#include <stdlib.h>
#define M 800#define N 600#define P 700float * mempool, * memptr;
__declspec(restrict) float * ma(int size)
{ 
float * retval; 
 retval = memptr; 
 memptr += size; 
return retval;
}
__declspec(restrict) float * init(int m, int n)
{ 
float * a; 
 int i, j; 
int k=1; 
a = ma(m * n); 
 if (!a) exit(1); 
for (i=0; i<m; i++)  
 for (j=0; j<n; j++) 
 a[i*n+j] = 0.1/k++; 
return a;
}
__declspec(noalias) void multiply(float * a, float * b, float * c)
{ 
int i, j, k; 
for (j=0; j<P; j++) 
 for (i=0; i<M; i++) 
  for (k=0; k<N; k++) 
   c[i * P + j] = a[i * N + k] * b[k * P + j];
}

int main()
{ 
 float * a, * b, * c; 
mempool = (float *) malloc(sizeof(float) * (M*N + N*P + M*P)); 
if (!mempool) 
puts("ERROR: Malloc returned null"); exit(1); 
memptr = mempool; 
 a = init(M, N); 
b = init(N, P); 
c = init(M, P); 
multiply(a, b, c);
} 

8. noinline__declspec(noinline)

告訴編譯器不去內(nèi)聯(lián)一個具體函數(shù)。

9. noreturn__declspec(noreturn)

告訴編譯器沒有返回值.注意添加__declspec(noreturn)到一個不希望返回的函數(shù)會導(dǎo)致已沒有定義錯誤.

10.nothrow__declspec(nothrow)

用于函數(shù)聲明,它告訴編譯器函數(shù)不會拋出異常。

e.g

#define WINAPI __declspec(nothrow) __stdcall
void WINAPI f1();
void __declspec(nothrow) __stdcall f2();
void __stdcall f3() throw();

11.novtable __declspec(novtable)

用在任意類的聲明,但是只用在純虛接口類,因此這樣的不能夠被自己實例話.它阻止編譯器初始化虛表指針在構(gòu)造和析構(gòu)類的時候,這將移除對關(guān)聯(lián)到類的虛表的 引用.如果你嘗試這實例化一個有novtable關(guān)鍵字的類,它將發(fā)生AV(access violation)錯誤.C++里virtual的缺陷就是vtable會增大代碼的尺寸,在不需要實例化的類或者純虛接口的時候,用這個關(guān)鍵字可以減 小代碼的大小.

e.g

#if _MSC_VER >= 1100 && !defined(_DEBUG)
#define AFX_NOVTABLE __declspec(novtable)
#else
#define AFX_NOVTABLE
#endif
....
class AFX_NOVTABLE CObject
{
...
};

這是vc里面的一段代碼,我們可以看出編譯Release版本時,在CObject前是__declspec(novtable),在debug版本沒有這個限制。

e.g

#include <stdio.h>
struct __declspec(novtable) X
{ 
virtual void mf();
};
struct Y : public X 
{ 
void mf() 
{ 
printf_s("In Yn"); 
}
};

12.selectany的作用

__declspec(selectany)可以讓我們在.h文件中初始化一個全局變量而不是只能放在.cpp中。比如有一個類,其中有一個靜態(tài)變量,那 么我們可以在.h中通過類似" __declspec(selectany) type class::variable = value; "這樣的代碼來初始化這個全局變量。既是該.h被多次include,鏈接器也會為我們剔除多重定義的錯誤。這個有什么好處呢,我覺得對于 teamplate的編程會有很多便利。

e.g

class test
{
public: 
static int t;
};
__declspec(selectany) int test::t = 0; 

13.thread 

thread 用于聲明一個線程本地變量. __declspec(thread)的前綴是Microsoft添加給Visual C++編譯器的一個修改符。它告訴編譯器,對應(yīng)的變量應(yīng)該放入可執(zhí)行文件或DLL文件中它的自己的節(jié)中。__declspec(thread)后面的變量 必須聲明為函數(shù)中(或函數(shù)外)的一個全局變量或靜態(tài)變量。不能聲明一個類型為__declspec(thread)的局部變量。

e.g

__declspec(thread) 
class X{
public: 
int I; 
} x; // x is a thread objectX y; // y is not a thread object 

14.uuid__declspec(uuid)

用于編譯器關(guān)聯(lián)一個GUID到一個有uuid屬性的類或結(jié)構(gòu)的聲明或者定義.

e.gstruct __declspec(uuid("00000000-0000-0000-c000-000000000046")) IUnknown;struct __declspec(uuid("{00020400-0000-0000-c000-000000000046}")) IDispatch;我們可以在MFC中查看源碼.:)

您可能感興趣的文章:

相關(guān)文章

  • 內(nèi)核線程優(yōu)先級設(shè)置的方法介紹

    內(nèi)核線程優(yōu)先級設(shè)置的方法介紹

    本篇文章介紹了,內(nèi)核線程優(yōu)先級設(shè)置的方法。需要的朋友參考下
    2013-05-05
  • 使用ShellClass獲取文件屬性詳細信息的實現(xiàn)方法

    使用ShellClass獲取文件屬性詳細信息的實現(xiàn)方法

    本篇文章是對ShellClass獲取文件屬性詳細信息的實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++11如何引入的尾置返回類型

    C++11如何引入的尾置返回類型

    C++11 標準引入的尾置返回類型,可以讓返回復(fù)雜類型的函數(shù)聲明更加清晰易讀,在無法使用C++14 標準的情況下,通過尾置返回類型的語法來推導(dǎo)函數(shù)模板的返回類型無疑是最簡便的方法,這篇文章主要介紹了C++11引入的尾置返回類型,需要的朋友可以參考下
    2023-01-01
  • C/C++實現(xiàn)全排列算法的示例代碼

    C/C++實現(xiàn)全排列算法的示例代碼

    本文主要介紹了C/C++實現(xiàn)全排列算法的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • 利用C語言實現(xiàn)經(jīng)典游戲斗獸棋

    利用C語言實現(xiàn)經(jīng)典游戲斗獸棋

    《斗獸棋》是一款棋類游戲,整個游戲畫面是分為兩塊區(qū)域,中間有河流分割兩塊區(qū)域,有橋梁可以讓彼此的動物過河,要取得勝利,必須占領(lǐng)那一邊動物的巢穴獲勝利。本文將用C語言實現(xiàn)這一游戲,需要的可以參考一下
    2022-03-03
  • C語言數(shù)據(jù)結(jié)構(gòu)之擴展字符詳解

    C語言數(shù)據(jù)結(jié)構(gòu)之擴展字符詳解

    掌握C語言數(shù)據(jù)結(jié)構(gòu)的關(guān)鍵在于理解其核心概念,擴展字符作為其中的重要一環(huán),對于編程人員來說至關(guān)重要,本指南將為您深入剖析擴展字符的相關(guān)知識,帶您輕松掌握C語言數(shù)據(jù)結(jié)構(gòu),讓我們一起探索這個令人著迷的領(lǐng)域吧!
    2024-03-03
  • Windows環(huán)境給FFmpeg集成AVS3解碼器

    Windows環(huán)境給FFmpeg集成AVS3解碼器

    libuavs3d是AVS3標準的解碼器,支持windows/linux/arm/ios等所有常用平臺,在移動端最高支持4K/30fps視頻實時解碼,解碼速度大幅領(lǐng)先AV1開源解碼器dav1d和aomdec,由于FFmpeg默認未啟用libuavs3d,因此需要重新配置FFmpeg,標明啟用libuavs3d,然后重新編譯安裝FFmpeg
    2024-05-05
  • C語言代碼實現(xiàn)三子棋小游戲

    C語言代碼實現(xiàn)三子棋小游戲

    這篇文章主要為大家詳細介紹了C語言代碼實現(xiàn)三子棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 一些C語言中字符串的算法問題解決實例小結(jié)

    一些C語言中字符串的算法問題解決實例小結(jié)

    這篇文章主要介紹了一些C語言中字符串的算法問題解決實例小結(jié),包括將字符串轉(zhuǎn)化為int類型的數(shù)及旋轉(zhuǎn)字符串等操作,需要的朋友可以參考下
    2016-03-03
  • CMake的簡單應(yīng)用

    CMake的簡單應(yīng)用

    這篇文章主要介紹了CMake的簡單應(yīng)用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論

凌海市| 宜良县| 平南县| 广东省| 乌拉特后旗| 莲花县| 台山市| 鄂托克旗| 台南县| 阿拉善右旗| 惠水县| 泾源县| 如东县| 刚察县| 台南市| 迭部县| 蒙阴县| 台东县| 广德县| 察隅县| 长乐市| 正安县| 周至县| 青浦区| 邮箱| 苏尼特左旗| 峨眉山市| 乐陵市| 克拉玛依市| 清流县| 垫江县| 安溪县| 平江县| 定边县| 河池市| 丰城市| 锡林郭勒盟| 陆丰市| 白银市| 郓城县| 迭部县|