【发布时间】:2019-12-18 14:29:36
【问题描述】:
我想从不同的变量中复制数据并将其放在一个数组中,以便进一步处理。
我研究了直接赋值和 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;
}
【问题讨论】:
-
对一个字节使用
memcpy可能比直接赋值花费更多时间。 -
选择可读性最好的版本,让编译器进行优化。
memcpy()在这里看起来确实不合适。 -
现代编译器可能会将 memcpy 更改为赋值。如果你能读懂汇编代码,把这段代码放到godbolt.org,或者你甚至可以略读一下汇编代码,看看它没有调用memcpy。
-
问题的前提是错误的。如果在多线程程序中进行赋值时这些变量更改,那么您将遇到数据竞争,并且程序的行为是未定义。跨度>
-
@FiddlingBits
memcpy是标准库函数,编译器可以随意优化。