深入解析C++編程中__alignof 與__uuidof運(yùn)算符的使用
__alignof 運(yùn)算符
C++11 引入 alignof 運(yùn)算符,該運(yùn)算符返回指定類型的對(duì)齊方式(以字節(jié)為單位)。為實(shí)現(xiàn)最大的可移植性,應(yīng)使用 alignof 運(yùn)算符,而不是特定于 Microsoft 的 __alignof 運(yùn)算符。
返回一個(gè) size_t 類型的值,該值是類型的對(duì)齊要求。
語法
__alignof( type )
備注
例如:
Expression | 值 |
---|---|
__alignof( char ) | 1 |
__alignof( short ) | 2 |
__alignof( int ) | 4 |
__alignof( __int64 ) | 8 |
__alignof( float ) | 4 |
__alignof( double ) | 8 |
__alignof( char* ) | 4 |
__alignof 值與基本類型的 sizeof 的值相同。但是,請(qǐng)考慮該示例:
typedef struct { int a; double b; } S; // __alignof(S) == 8
在該示例中,__alignof 值是結(jié)構(gòu)中的最大元素的對(duì)齊要求。
同樣,
typedef __declspec(align(32)) struct { int a; } S;
__alignof(S) 等于 32。
__alignof 的用途之一是作為某個(gè)內(nèi)存分配例程的參數(shù)。例如,假定下面定義的結(jié)構(gòu) S,您可以調(diào)用名為 aligned_malloc 的內(nèi)存分配例程以在特定對(duì)齊邊界上分配內(nèi)存。
typedef __declspec(align(32)) struct { int a; double b; } S; int n = 50; // array size S* p = (S*)aligned_malloc(n * sizeof(S), __alignof(S));
__uuidof 運(yùn)算符
檢索 GUID 并附加到表達(dá)式。
語法
__uuidof ( expression )
備注
該 表達(dá)式 可以是類型名稱、指針、引用或該類型的數(shù)組、特定類型的模板或這些類型的變量。只要編譯器可以使用它查找附加的 GUID,自變量就是有效的。
內(nèi)部函數(shù)的一個(gè)特例就是當(dāng)在 0 或 NULL 中作為參數(shù)提供。在這種情況下,__uuidof 將返回由零組成的GUID。
使用此關(guān)鍵字用以提取附加的 GUID:
一個(gè)對(duì)象通過 uuid 擴(kuò)展其特性。
庫塊以使用 模塊 屬性創(chuàng)建。
System_CAPS_note注意
在調(diào)試版本中,__uuidof 總是動(dòng)態(tài)初始化一個(gè)對(duì)象 (運(yùn)行時(shí))。當(dāng)發(fā)布版本時(shí),__uuidof 可以靜態(tài)初始化對(duì)象(在編譯時(shí))。
下面的代碼 (使用ole32.lib編譯) 將顯示一個(gè)創(chuàng)建模塊屬性庫塊uuid:
// expre_uuidof.cpp // compile with: ole32.lib #include "stdio.h" #include "windows.h" [emitidl]; [module(name="MyLib")]; [export] struct stuff { int i; }; int main() { LPOLESTR lpolestr; StringFromCLSID(__uuidof(MyLib), &lpolestr); wprintf_s(L"%s", lpolestr); CoTaskMemFree(lpolestr); }
注釋
當(dāng)庫名不再在范圍之內(nèi),你可以使用__LIBID_而不是 __uuidof。例如:
StringFromCLSID(__LIBID_, &lpolestr);
- 詳解C++中的函數(shù)調(diào)用和下標(biāo)以及成員訪問運(yùn)算符的重載
- 詳解C++編程中一元運(yùn)算符的重載
- 詳解C++語言中的加法運(yùn)算符與賦值運(yùn)算符的用法
- C++編程中的或||、與&&、非!邏輯運(yùn)算符基本用法整理
- 深入解析C++編程中的運(yùn)算符重載
- 詳解C++中new運(yùn)算符和delete運(yùn)算符的使用
- 簡單了解C++語言中的二元運(yùn)算符和賦值運(yùn)算符
- 詳解C++中const_cast與reinterpret_cast運(yùn)算符的用法
- 講解C++編程中Address-of運(yùn)算符&的作用及用法
- 詳解C++編程中的sizeof運(yùn)算符與typeid運(yùn)算符
- C++編程中刪除運(yùn)算符與相等運(yùn)算符的使用解析
- C++編程中逗號(hào)運(yùn)算符和條件運(yùn)算符的使用方法講解
- C++中的運(yùn)算符和運(yùn)算符優(yōu)先級(jí)總結(jié)
相關(guān)文章
C++中string類的常用方法實(shí)例總結(jié)
string類是C++提供的抽象數(shù)據(jù)類型,其支持可變長字符串,下面這篇文章主要給大家總結(jié)介紹了關(guān)于C++中string類的常用方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03OpenCV中C++函數(shù)imread讀取圖片的問題及解決方法
利用C++函數(shù)imread讀取圖片的時(shí)候返回的結(jié)果總是空,而利用C函數(shù)cvLoadImage時(shí)卻能讀取到圖像。怎么回事?今天小編通過本教程給大家簡單說明原因2017-03-03vector與map的erase()函數(shù)詳細(xì)解析
vector和map都不能將it++寫在for循環(huán)中,而在循環(huán)體內(nèi)erase(it)2013-09-09C++實(shí)現(xiàn)LeetCode(109.將有序鏈表轉(zhuǎn)為二叉搜索樹)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(109.將有序鏈表轉(zhuǎn)為二叉搜索樹),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07