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]代码>到结构,生成的代码将完全不同。例子: