gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:51:49 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com