【发布时间】:2019-09-14 12:38:43
【问题描述】:
这一直困扰着我很长时间:如何将指针从任何东西转换为 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。 (例如this one) 所以我不禁想知道是否有任何“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 来完成类似于serialize 的任务,其中指针作为整数数学以及sizeof,
但我猜这里也是UB。
即使他们是 UB,编译器编写者通常也会做一些理性的事情来确保一切正常。 我同意:这不是不合理的要求。
所以我的问题真的是,对于上面提到的两个常见任务:
- 真的没有“DB”方式来完成它们以满足终极 C++ 怪胎吗?
- 除了我一直在做的事情之外,还有什么更好的方法来完成它们吗?
谢谢!
【问题讨论】:
-
auto cp = reinterpret_cast<char *>(&d);不是 UB,您可以从结果中读取字符
标签: c++ reinterpret-cast pointer-conversion