首页 > 解决方案 > 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;
}

标签: cmemcpy

解决方案


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

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

由于cus_data[0] = pack_id;是最易读的,这就是你应该做的。


在这种情况下,因为它在多线程环境中运行

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

变量的大小无关紧要,因为除非您使用 C11_Atomic和类似的语言,否则 C 语言中的任何内容都不能保证原子访问。


推荐阅读