基本介紹
- 中文名:類型雙關
- 外文名:Type punning
- 套用:C語言、C++
- 性質:數據類型
- 領域:計算機科學
簡介,Socket例子,浮點例子,使用union,
簡介
Socket例子
Berkeley sockets使用類型雙關來處理IP位址。函式bind綁定一個位初始化的套接字到一個IP位址,其聲明如下:
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
bind函式通常如此使用:
struct sockaddr_in sa = {0};int sockfd = ...;sa.sin_family = AF_INET;sa.sin_port = htons(port);bind(sockfd, (struct sockaddr *)&sa, sizeof sa);
這是因為struct sockaddr_in與struct sockaddr有相同的記憶體布局。兩個類型的指針可以互相轉換。
浮點例子
類型雙關不僅限於struct。對於浮點數,判斷其是否為負值:
bool is_negative(float x) { return x < 0.0; }
注意有一些特例,如x是負0,前一種實現返回false而第二種實現返回true.
這樣的實現適合於實時計算而又不能被最佳化實現的情形。注意把所有假定均寫為注釋記錄下來,並寫入靜態斷言(static assertions)驗證可移植期望是否滿足。雷神之錘III競技場遊戲用此方法實現平方根倒數速算法。
使用union
為了遵循C99/C++的嚴格別名規則,可以使用union:
bool is_negative(float x) { union { unsigned int ui; float d; } my_union = { .d = x }; return my_union.ui & 0x80000000; }
GCC編譯器支持這樣的語言擴展。