Đọc Thế kỷ 21 C Tôi đã đến chương 6 trong phần "Đánh dấu các giá trị số đặc biệt bằng NaNs" , trong đó giải thích việc sử dụng các bit trong lớp phủ để lưu trữ một số mẫu bit tùy ý, để sử dụng chúng làm điểm đánh dấu hoặc con trỏ (cuốn sách đề cập WebKit sử dụng kỹ thuật này).
Tôi không thực sự chắc chắn rằng tôi đã hiểu được tiện ích của kỹ thuật này, tôi thấy đó là một hack (nó phụ thuộc vào phần cứng không quan tâm đến giá trị của mantissa trong NaN) nhưng đến từ nền Java tôi không quen độ nhám của C.
Đây là đoạn mã đặt và đọc điểm đánh dấu trong NaN
#include <stdio.h>
#include <math.h> //isnan
double ref;
double set_na(){
if (!ref) {
ref=0/0.;
char *cr = (char *)(&ref);
cr[2]='a';
}
return ref;
}
int is_na(double in){
if (!ref) return 0; //set_na was never called==>no NAs yet.
char *cc = (char *)(&in);
char *cr = (char *)(&ref);
for (int i=0; i< sizeof(double); i++)
if (cc[i] != cr[i]) return 0;
return 1;
}
int main(){
double x = set_na();
double y = x;
printf("Is x=set_na() NA? %i\n", is_na(x));
printf("Is x=set_na() NAN? %i\n", isnan(x));
printf("Is y=x NA? %i\n", is_na(y));
printf("Is 0/0 NA? %i\n", is_na(0/0.));
printf("Is 8 NA? %i\n", is_na(8));
}
nó in:
Is x=set_na() NA? 1
Is x=set_na() NAN? 1
Is y=x NA? 1
Is 0/0 NA? 0
Is 8 NA? 0
và tại webkit của JSValue.h giải thích về mã hóa, nhưng không hiểu tại sao nó được sử dụng.
Mục đích của kỹ thuật này là gì? Là lợi ích của không gian / hiệu suất đủ cao để cân bằng bản chất hackish của nó?