c - 数据复制方法直接分配与c中的memcpy

标签 c memcpy

我想从不同的变量中复制数据并将它们放在一个数组中,以便我可以进一步处理它。

我研究了直接赋值和 memcpy 方法,认为 memcpy 用于复制整个缓冲区而不是单个元素。此外,我认为对单个字节使用 memcpy 可能会花费时间并浪费 CPU 周期。

你能否从下面的例子中告诉我在这种情况下应该使用什么,因为它在多线程环境中运行(不同的例子)并且变量可能会改变?

#include <stdio.h>
#include <stdint.h>

int main()
{

    printf("Direct assign method\n");

    uint8_t pack_id = 123;
    uint8_t pack_age = 76;
    uint8_t pack_cmd = 30;

    uint8_t cus_data[3] = {0};

    cus_data[0] = pack_id;
    cus_data[1] = pack_age;
    cus_data[2] = pack_cmd;

    printf("Memcpy method\n");

    pack_id = 112;
    pack_age = 89;
    pack_cmd = 25;

    memcpy(&cus_data[0], &pack_id, sizeof(pack_id));
    memcpy(&cus_data[1], &pack_age, sizeof(pack_age));
    memcpy(&cus_data[2], &pack_cmd, sizeof(pack_cmd));

    return 0;
}

最佳答案

cus_data[0] = pack_id; 永远不会比 memcpy(&cus_data[0], &pack_id, sizeof(pack_id)); 慢。然而,如果编译器内联 memcpy 调用,它们可能同样快,这是很有可能的。

您应该做的不是担心微优化,而是编写尽可能最易读的代码。当您遇到实际性能问题时,担心优化。

因为 cus_data[0] = pack_id; 是最易读的,所以你应该这样做。


in such case since it is running in multithreaded environment

没有区别。您需要保护变量免受重入错误的影响,或者您不需要保护它们。这与简单赋值与 memcpy 无关,因为它们都不能保证是原子的。

变量的大小无关紧要,因为 C 语言中没有任何内容可以保证原子访问,除非您使用 C11 _Atomic 和类似的。

关于c - 数据复制方法直接分配与c中的memcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59394196/

相关文章:

c - 将 4 个字节复制到 float 时缓冲区溢出

c - 在标准 C 中从头开始实现 memcpy 在技术上是不可能的吗?

c++ - 复制跨步数据(进出 CUDA 设备)的有效方法?

c++ - 为什么文件扩展名对编译有影响?

c - 确定 sscanf 是否使用 %*s 读取任何内容

c - 遍历链表会删除数据

c - 如何从字符串中读取以空格分隔的整数

c - 索拉里斯 10 : handle gracefully ENOBUFS error when changing socket buffer

c - memcpy 混淆溢出/用 gcc 覆盖?

c - memcpy 期间的段错误