这一直困扰着我很长时间:如何进行指针转换从任何东西到char *
将二进制文件转储到磁盘。
在 C 中,您甚至都不会考虑它。
double d = 3.14;
char *cp = (char *)&d;
// do what u would do to dump to disk
然而,在 C++ 中,每个人都说 C-cast 不受欢迎,我一直在这样做:
double d = 3.14;
auto cp = reinterpret_cast<char *>(&d);
现在这是从cppreference复制的,所以我认为这是正确的方法。
但是,我从多个来源读到说这是 UB。(例如这个)所以我不禁想知道是否有任何“DB”方式(根据那个帖子,没有)。
我经常遇到的另一个场景是实现这样的 API:
void serialize(void *buffer);
你可以将很多东西转储到这个缓冲区。现在,我一直在这样做:
void serialize(void *buffer) {
int intToDump;
float floatToDump;
int *ip = reinterpret_cast<int *>(buffer);
ip[0] = intToDump;
float *fp = reinterpret_cast<float *>(&ip[1]);
fp[0] = floatToDump;
}
好吧,我想这也是UB。
现在,真的没有“DB”方式来完成这些任务吗?我见过有人用指针作为整数数学uintptr_t
来完成类似于任务的任务,但我在这里猜测它也是 UB。serialize
sizeof
即使他们是 UB,编译器编写者通常也会做一些合理的事情来确保一切正常。我对此表示同意:要求这不是不合理的事情。
所以我的问题真的是,对于上面提到的两个常见任务:
- 真的没有“DB”方式来完成它们以满足最终的 C++ 怪胎吗?
- 除了我一直在做的事情之外,还有什么更好的方法来完成它们吗?
谢谢!