在阅读RocksDB的skiplist源代码时,我发现了以下代码:
int UnstashHeight() const {
int rv;
memcpy(&rv, &next_[0], sizeof(int));
return rv;
}
为什么使用memcpy
?如果像这样使用指针类型转换会怎么样:
int UnstashHeight() const {
int rv;
rv = *((int*)&next_[0]);
return rv;
}
memcpy 在支持不同的 cpu 目标方面是否具有更好的可移植性? 还是根本没有区别?
最佳答案
我会说:
- memcpy 是一个函数,从各个方面来看,它都不像解决分配问题的机器指令那么简单
- 编译器可以在某些上下文中优化赋值,并在代码中声明的多个变量之间共享内存中的相同值(显然,如果有意义的话)
- 由于通常映射到单个机器指令上,因此它受到所属平台的限制。正如评论中所述,ARM 处理器要求根据我们正在处理的数据将数据对齐到 2、4、8 字节(在这种情况下为 4 字节/32 位)。如果不满足约束,则会引发中断。
- memcpy 对于来自网络或编解码器的数据非常有效(除了大端和小端问题),其中结构尝试使用尽可能少的字节和位。也就是说,您的 WORD 可能不与 32 位边界对齐,但 memcpy 会处理这个问题。
- 赋值目标是 int 的实例,赋值不需要检查目标:它已分配且根据定义有效(编译保证)。 memcpy 目标是一个指针,如果您广泛使用该函数,您可能需要开始检查代码中目标 ptr 是否不为 null。
也就是说,也许我有点超出你的目标,但没有足够的代码来判断用于作业的形式主义。
我的2美分
关于c++ - memcpy 和单个数据字的赋值语句有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61917207/