Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构副本与成员副本(节省时间)_C_Performance_Structure - Fatal编程技术网

C 结构副本与成员副本(节省时间)

C 结构副本与成员副本(节省时间),c,performance,structure,C,Performance,Structure,我们知道我们可以通过赋值直接将一个结构复制到另一个结构 struct STR { int a; int b; }; struct STR s1 = {4, 5}; struct STR s2; 方法1: s2 = s1; 将s1分配给s2 方法2: s2.a = s1.a; s2.b = s1.b; 就时间效率而言,哪种方法更快?或者两者都需要相同的操作时间。在数据处理的大结构方面考虑! 基本上你说不出来,因为这取决于编译器、目标体系结构等 然而,对于现代C编译器,启用优化后,

我们知道我们可以通过赋值直接将一个结构复制到另一个结构

struct STR
{
   int a;
   int b;
};
struct STR s1 = {4, 5};
struct STR s2;
方法1:

s2 = s1;
将s1分配给s2

方法2:

s2.a = s1.a;
s2.b = s1.b;

就时间效率而言,哪种方法更快?或者两者都需要相同的操作时间。在数据处理的大结构方面考虑! 基本上你说不出来,因为这取决于编译器、目标体系结构等

然而,对于现代C编译器,启用优化后,它们通常是相同的。例如,x86-64上最新的GCC为以下两个版本生成完全相同的代码:

void a1()
{
  s2 = s1;
}

void a2()
{
  s2.a = s1.a;
  s2.b = s1.b;
}
产生:

a1():
mov rax, QWORD PTR s1[rip] 
mov QWORD PTR s2[rip], rax
ret

a2():
mov rax, QWORD PTR s1[rip]
mov QWORD PTR s2[rip], rax
ret

方法1很可能更有效,因为通常归结为调用
memcpy
函数,该函数通常针对平台进行了高度优化。方法1的其他优点:如果添加结构成员,则无需更改复制代码。让我们问问优化编译器:差异可能可以忽略不计。我刚刚注意到@StoryTeller的链接:如果第三个元素添加到另一种类型(float)的结构中,则反汇编是不同的。为什么会这样?。。。每个人(包括我)都忘了提到的是,它在很大程度上取决于结构的实际内容。添加
intc[100]到结构,生成的代码将完全不同。例子: