background image

c++ __declspec 的用法

语法说明:
__declspec ( extended-decl-modifier-seq )

扩展修饰符:
1align(#) 
   
__declspec(align(#))

 

精确控制用户自定数据的对齐方式 ,#是对齐值。

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

【转】它与#pragma pack()是一对兄弟,前者规定了对齐的最小值,后者规定了对齐的最大值。

 

同时出现时,前者优先级高。 __declspec(align())的一个特点是,
它仅仅规定了数据对齐的位置,而没有规定数据实际占用的内存长度,当指定的数据被放置
在确定的位置之后,其后的数据填充仍然是按照#pragma pack 规定的方式填充的,这时候类
/结构的实际大小和内存格局的规则是这样的:在__declspec(align())之前,数据按照#pragma 
pack 规定的方式填充,如前所述。当遇到__declspec(align())的时候,首先寻找距离当前偏移
向后最近的对齐点(满足对齐长度为 max(数据自身长度,指定值)),然后把被指定的数据类型
从这个点开始填充,其后的数据类型从它的后面开始,仍然按照#pragma pack 填充,直到遇
到 下 一 个 __declspec(align()) 。 当 所 有 数 据 填 充 完 毕 , 把 结 构 的 整 体 对 齐 数 值 和
__declspec(align())

 

规定的值做比较,取其中较大的作为整个结构的对齐长度。 特别的,当

__declspec(align())指定的数值比对应类型长度小的时候,这个指定不起作用。
2: allocate("segname") 
用 __declspec(allocate("segname")) 声 明 一 个 已 经 分 配 了 数 据 段 的 一 个 数 据 项 。 它 和
#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 ) 说明一个函数,类型,或别的标识符在新的版本或未来版
本中不再支持,你不应该用这个函数或类型。它和#pragma deprecated 作用一样。

e.g
#define MY_TEXT "function is deprecated"
void func1(void) {}