c++ - memcpy 和单个数据字的赋值语句有什么区别?

标签 c++ c rocksdb

在阅读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/

相关文章:

cassandra - 分层压缩中层数的影响是什么?

c++ - 点云 ICP 对齐

c++ - 通过 SConstruct 链接以 boost

c++ - ARM GCC 交叉编译器 fedora 22

c - 线程同步和设置线程的优先级

mongodb - 无法理解 MongoDB 和 RocksDB 之间的关系

c++ - 应用程序崩溃,因为高输入

c - C 中的语法困惑

我可以在 C 中使用 asm() 代替 asm 吗?

java - Kafka Streams JoinWindow 的数据